XLiveServices 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9d4ce325425418c79672864729e094bea42b9198
4
+ data.tar.gz: 10181bca72cc853d7938a9d11c6b626493e27c76
5
+ SHA512:
6
+ metadata.gz: 9c1b0b7b6c5f1d1f803118485beb56c806cc1280e4eb17be7276b3885d5a16b1c30a823feed2d39afa12d6411c4d54eb7539a22e3a8eaf4128b9930317d7d1b0
7
+ data.tar.gz: 171bfba640d78d503d1ad3d44cebfafe0fb2f4c94f33cc5ebb9ccef95c866f6b53a0bd15e866dfb09d447712aa0ad8af451bfba93ef438bb3d5f4b63b87cb77c
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.1
4
+ - 2.0.0
5
+ - ruby-head
6
+ matrix:
7
+ allow_failures:
8
+ - rvm: ruby-head
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --markup markdown
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # XLiveServices
2
+
3
+ A library to consume Xbox LIVE and Games for Windows LIVE services.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'xlive_services'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install XLiveServices
18
+
19
+ ## Unlicense
20
+
21
+ ![Copyright-Free](http://unlicense.org/pd-icon.png)
22
+
23
+ All text, documentation, code and files in this repository are in public domain (including this text, README).
24
+ It means you can copy, modify, distribute and include in your own work/code, even for commercial purposes, all without asking permission.
25
+
26
+ [About Unlicense](http://unlicense.org/)
27
+
28
+ ## Contributing
29
+
30
+ 1. Fork it ( https://github.com/davispuh/XLiveServices/fork )
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create a new Pull Request
35
+
36
+
37
+ **Warning**: By sending pull request to this repository you dedicate any and all copyright interest in pull request (code files and all other) to the public domain. (files will be in public domain even if pull request doesn't get merged)
38
+
39
+ Also before sending pull request you acknowledge that you own all copyrights or have authorization to dedicate them to public domain.
40
+
41
+ If you don't want to dedicate code to public domain or if you're not allowed to (eg. you don't own required copyrights) then DON'T send pull request.
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'yard'
4
+
5
+ desc 'Default: run specs.'
6
+ task :default => :spec
7
+
8
+ desc 'Run specs'
9
+ RSpec::Core::RakeTask.new(:spec) do |t|
10
+ end
11
+
12
+ YARD::Rake::YardocTask.new(:doc) do |t|
13
+ end
data/UNLICENSE ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
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 NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <http://unlicense.org/>
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'xlive_services/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'XLiveServices'
8
+ spec.version = XLiveServices::VERSION
9
+ spec.authors = ['Dāvis']
10
+ spec.email = ['davispuh@gmail.com']
11
+ spec.summary = 'Interact with Xbox LIVE and Games for Windows LIVE services.'
12
+ spec.description = 'A library to consume Xbox LIVE and Games for Windows LIVE services.'
13
+ spec.homepage = 'https://github.com/davispuh/XLiveServices'
14
+ spec.license = 'UNLICENSE'
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_runtime_dependency 'httpi'
22
+ spec.add_runtime_dependency 'multi_xml'
23
+ spec.add_runtime_dependency 'LiveIdentity', '>= 0.0.2'
24
+ spec.add_runtime_dependency 'savon'
25
+ spec.add_runtime_dependency 'builder'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.6'
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'rspec'
30
+ spec.add_development_dependency 'simplecov'
31
+ spec.add_development_dependency 'yard'
32
+ end
data/data/certs.pem ADDED
@@ -0,0 +1,103 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIGCDCCA/CgAwIBAgIKYV2q0gAGAAAAQDANBgkqhkiG9w0BAQUFADAnMSUwIwYD
3
+ VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTEyMDUxNTIwNDA1
4
+ NVoXDTE2MDUxNTIwNTA1NVowgYAxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ
5
+ kiaJk/IsZAEZFgltaWNyb3NvZnQxFDASBgoJkiaJk/IsZAEZFgRjb3JwMRcwFQYK
6
+ CZImiZPyLGQBGRYHcmVkbW9uZDEfMB0GA1UEAxMWTVNJVCBNYWNoaW5lIEF1dGgg
7
+ Q0EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3I6ADrWGkpEYSH
8
+ HJ+HTUQ9OBvHE5PnFEwXK9t1CMDJIcqu4B/ojP6h3ySMvwKc7Zm+OlMqRU6wSHg3
9
+ 3KFj7wO3lClmbGbXbGpIZbLdRyEjG7hBdC+W3ZgiufrzDkqwLwui3rcCE0JwP3gE
10
+ FHLjOit+KEgdlrTbFjmNs8RZodei0mRhMytBGMWrlW9dIgd3zVOdA0ll1Yj1X53w
11
+ xGlPkQilOQeWNq8tZNwmWsET7jE51l/cl/wnqgV4R8UiJmNTfjfCe2Q9acvw+4oV
12
+ PlKzhmq0wRw7svXHPsV23XRodnpV5oB7Loym2ruRWgfNGUrqCFz/wUnWewa/67dK
13
+ n7QnnBcCAwEAAaOCAdowggHWMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGC
14
+ NxUCBBYEFCO30O1oke9mm+EFQHq+Z8oz1ga9MB0GA1UdDgQWBBTr2xFe+Ame2NZi
15
+ nP1ineOESijhJzAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMC
16
+ AYYwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBQqTZeVXTR+nbbmM76c
17
+ J8FwfmfbwTCBowYDVR0fBIGbMIGYMIGVoIGSoIGPhjZodHRwOi8vbXNjcmwubWlj
18
+ cm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9tc3d3dyg2KS5jcmyGNGh0dHA6Ly9j
19
+ cmwubWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9tc3d3dyg2KS5jcmyGH2h0
20
+ dHA6Ly9jb3JwcGtpL2NybC9tc3d3dyg2KS5jcmwweQYIKwYBBQUHAQEEbTBrMDwG
21
+ CCsGAQUFBzAChjBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9t
22
+ c3d3dyg2KS5jcnQwKwYIKwYBBQUHMAKGH2h0dHA6Ly9jb3JwcGtpL2FpYS9tc3d3
23
+ dyg2KS5jcnQwDQYJKoZIhvcNAQEFBQADggIBAKM2cvdFC6eGN94gjfXXjtqJAHpS
24
+ S4UysjLX7YBX/Q1RHNEePQw+kSow4lO8YQeJAhG5G4NI0xrHR5Zit8/e1w24nYSO
25
+ 3tXm5LnABuMc9DFDH1P8SkK1myPNsuwND4GJ/1mpANMESguvW4T1O0+5N5GIIeSc
26
+ ylJ2Y36IemW0jhZq9GC9LA7vF4YrdQlYc8VPuagb7yr0tqO5B/CkkDlT3+G6Apil
27
+ pYIRoQZTssLr/epncjdj0IXPhgXIw3PB2/PE0lX/oB3nchQa/7L/CEJIQAoZgs8i
28
+ 8wXF1d8LKcQ6DsUyOO8vlJoM8tTuv2LH4qRfPW54vBDBLkow8ofbiTi+/syAj/X5
29
+ XMtc8eoCCGulC+8gXKM0zPCAth9juUQyHCZBm92To2QBVxEhQ5QqVy2KSsuKKEAK
30
+ +1D5ryZ0E5eCTmxk69HGv179JdoFRkquxy/HBO8ucS7iqFuk6rJvqJE1xLdjF2IO
31
+ J448JM09RWkF3FLFNfgRwB3fYmD04aZecLhFdAOr0RZ0457TwaPokJaKisJGRp25
32
+ XGwCHTKE6xSFdpWqTS1ptgL2/u001Yzm+qxd3ANA5s93if+xKMqGjMjnMUf8Fv5U
33
+ DPUmsX7cmCZwWCYTXMd12xLeTKz/mgzqosIcQQSM5keXR2+JxUjeNw1q2fBoJFz/
34
+ GVnm4XA3OA3b7rDi
35
+ -----END CERTIFICATE-----
36
+ -----BEGIN CERTIFICATE-----
37
+ MIIFATCCA+mgAwIBAgIEBydvrjANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
38
+ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
39
+ VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTEyMDQyNTE3NDEzNloX
40
+ DTIwMDQyNTE3NDA1NVowJzElMCMGA1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1
41
+ dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL5AVBGqKHlm
42
+ Xqm7sJNiS3MZqukvkUxtlzclaLiwNlCUXO//xMQXdkNX/KDhxjPsMGK+NQ8jepZN
43
+ bHRiCX4xSE6fTapbsxa3/qApL2WlS6xqVoq/KHBq3zcY3+zGhyI+Ft04HA/iBb53
44
+ q+6Fih4NIz/pJOGQR7JnOxU+VSA8+fVC16/FZg2alBe5amd8qPqxJgAEI9VNo66N
45
+ eWCxjoNPzbt3eCey6HStH0w0gDF/i+RQfm9/z1Xaxvu2WvVdHTiUpf6wjSJjI+dw
46
+ QEC/iapURiUD7KTyrcBAs3L+lLXZlrIbc17V9GtHQXmk2vOOLo04TcleFxyutUw2
47
+ a+h/2STHKPCnhr7oHQi023IjZNFC8/VM2qzztqV1aPzwuwJhXR56B1IpvnQSQlOc
48
+ jczpiHukVTYIWIwhicW6E+htm4GKd8Y4bPU6HZE3Vyup6ytGSqiXKIujfkrdjafT
49
+ AhB8lrDIvIYoBtZXoqdm8RfWzF9VEj1ZA6LH0tZptA0l+fHTlFYWLia8lvm6HFGb
50
+ gfE3vHfuftmaePZBtHHfECVbsuE6x3vybLMZtyDnienEpWqkfDkk7uddKyvJkf6h
51
+ PDMlvcVBFJLuz1Y6JhN1yhFcxierSYirVXL8ZUjcrs3xj4sQZiqQLguLt/44dc2x
52
+ dYC2j89DHCEpkw/jE7nisMiyRipaFAwdAgMBAAGjggEAMIH9MBIGA1UdEwEB/wQI
53
+ MAYBAf8CAQEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcCARYt
54
+ aHR0cDovL2N5YmVydHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnkuY2ZtMA4G
55
+ A1UdDwEB/wQEAwIBhjAfBgNVHSMEGDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DBC
56
+ BgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY2RwMS5wdWJsaWMtdHJ1c3QuY29tL0NS
57
+ TC9PbW5pcm9vdDIwMjUuY3JsMB0GA1UdDgQWBBQqTZeVXTR+nbbmM76cJ8Fwfmfb
58
+ wTANBgkqhkiG9w0BAQUFAAOCAQEAIz6HbtPK1g6wNiWNzArO3F1080Ib76rASXOF
59
+ zH0vdwkjxSxQHUbDaGjvEDLZTX7jWuMdGDzSQFTN71nu3/77cEq82HQ3K9ykaHFQ
60
+ umPLRN0RSP/48f9gunyqMH3dF7F36lCQIAALoz1dmHFRn90twHheDVWxg0Xe5VmY
61
+ baThaXwy0AR796kdlzvVWb/Lb52ktqW7QRHtyJGDFVWuWTa3n2rwuDj5fDIllcwz
62
+ 8THn38t4SzYf9FXgvSj5yrlkmc7rYemBcpTTm80KKyqklIOuagwjRA41raHp7NjX
63
+ dZCN4dazxVD8XdX7b5Lh9H7wrq/5ObPOSwGcvU738fJvzsA22A==
64
+ -----END CERTIFICATE-----
65
+ -----BEGIN CERTIFICATE-----
66
+ MIIEFTCCA36gAwIBAgIEByeO7TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
67
+ UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
68
+ cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
69
+ b2JhbCBSb290MB4XDTEyMDQxODE2MzYxOFoXDTE4MDgxMzE2MzUxN1owWjELMAkG
70
+ A1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVz
71
+ dDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZI
72
+ hvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uO
73
+ KymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnn
74
+ c+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP
75
+ wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPg
76
+ kAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFc
77
+ B5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaOCAUcw
78
+ ggFDMBIGA1UdEwEB/wQIMAYBAf8CAQMwSgYDVR0gBEMwQTA/BgRVHSAAMDcwNQYI
79
+ KwYBBQUHAgEWKWh0dHA6Ly9jeWJlcnRydXN0Lm9tbmlyb290LmNvbS9yZXBvc2l0
80
+ b3J5MA4GA1UdDwEB/wQEAwIBBjCBiQYDVR0jBIGBMH+heaR3MHUxCzAJBgNVBAYT
81
+ AlVTMRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJl
82
+ clRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg
83
+ R2xvYmFsIFJvb3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVi
84
+ bGljLXRydXN0LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwDQYJKoZIhvcN
85
+ AQEFBQADgYEAkx3+i65G7MupD6vl78qyaBZo2I/6E6mvs8st50tujmkqwisQCo32
86
+ rnO2ufsU/V9tuFC2xIrWQH7Xw8tz3MldW6+wQbU36+rcIJHENGr0ofOWnTeGl+Fx
87
+ pN19+kSElK7XCQQidg9kUTWpJA/5C9sy2sL+wbkqXHonE8qxSDpx0EM=
88
+ -----END CERTIFICATE-----
89
+ -----BEGIN CERTIFICATE-----
90
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
91
+ VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
92
+ bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
93
+ b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
94
+ UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
95
+ cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
96
+ b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
97
+ iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
98
+ r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
99
+ 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
100
+ GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
101
+ 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
102
+ lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
103
+ -----END CERTIFICATE-----
@@ -0,0 +1,281 @@
1
+ require 'win_common'
2
+
3
+ module XLiveServices
4
+ module XOnline
5
+ module HRESULT
6
+ XONLINE_E_OVERFLOW = 0x80150001
7
+ XONLINE_E_NO_SESSION = 0x80150002
8
+ XONLINE_E_USER_NOT_LOGGED_ON = 0x80150003
9
+ XONLINE_E_NO_GUEST_ACCESS = 0x80150004
10
+ XONLINE_E_NOT_INITIALIZED = 0x80150005
11
+ XONLINE_E_NO_USER = 0x80150006
12
+ XONLINE_E_INTERNAL_ERROR = 0x80150007
13
+ XONLINE_E_OUT_OF_MEMORY = 0x80150008
14
+ XONLINE_E_TASK_BUSY = 0x80150009
15
+ XONLINE_E_SERVER_ERROR = 0x8015000A
16
+ XONLINE_E_IO_ERROR = 0x8015000B
17
+ XONLINE_E_USER_NOT_PRESENT = 0x8015000D
18
+ XONLINE_E_INVALID_REQUEST = 0x80150010
19
+ XONLINE_E_TASK_THROTTLED = 0x80150011
20
+ XONLINE_E_TASK_ABORTED_BY_DUPLICATE = 0x80150012
21
+ XONLINE_E_INVALID_TITLE_ID = 0x80150013
22
+ XONLINE_E_SERVER_CONFIG_ERROR = 0x80150014
23
+ XONLINE_E_END_OF_STREAM = 0x80150015
24
+ XONLINE_E_ACCESS_DENIED = 0x80150016
25
+ XONLINE_E_GEO_DENIED = 0x80150017
26
+ XONLINE_E_LOGON_NO_NETWORK_CONNECTION = 0x80151000
27
+ XONLINE_E_LOGON_CANNOT_ACCESS_SERVICE = 0x80151001
28
+ XONLINE_E_LOGON_UPDATE_REQUIRED = 0x80151002
29
+ XONLINE_E_LOGON_SERVERS_TOO_BUSY = 0x80151003
30
+ XONLINE_E_LOGON_CONNECTION_LOST = 0x80151004
31
+ XONLINE_E_LOGON_KICKED_BY_DUPLICATE_LOGON = 0x80151005
32
+ XONLINE_E_LOGON_INVALID_USER = 0x80151006
33
+ XONLINE_E_LOGON_FLASH_UPDATE_REQUIRED = 0x80151007
34
+ XONLINE_E_LOGON_SG_CONNECTION_TIMEDOUT = 0x8015100C
35
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_NO_PRIVILEGE = 0x8015102A
36
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_NOT_CHILD = 0x8015102B
37
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_NOT_ADULT = 0x8015102C
38
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_NO_PI = 0x8015102D
39
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_PI_MISMATCH = 0x8015102E
40
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_ALREADY = 0x8015102F
41
+ XONLINE_E_ACCOUNTS_GRADUATE_USER_QUEUED = 0x80151031
42
+ XONLINE_E_ACCOUNTS_SWITCH_PASSPORT_NEW_PASSPORT_INELIGIBLE = 0x80151032
43
+ XONLINE_E_ACCOUNTS_NO_AUTHENTICATION_DATA = 0x80151033
44
+ XONLINE_E_ACCOUNTS_CLIENT_TYPE_CONFIG_ERROR = 0x80151034
45
+ XONLINE_E_ACCOUNTS_CLIENT_TYPE_MISSING = 0x80151035
46
+ XONLINE_E_ACCOUNTS_CLIENT_TYPE_INVALID = 0x80151036
47
+ XONLINE_E_ACCOUNTS_COUNTRY_NOT_AUTHORIZED = 0x80151037
48
+ XONLINE_E_ACCOUNTS_TAG_CHANGE_REQUIRED = 0x80151038
49
+ XONLINE_E_ACCOUNTS_ACCOUNT_SUSPENDED = 0x80151039
50
+ XONLINE_E_ACCOUNTS_TERMS_OF_SERVICE_NOT_ACCEPTED = 0x8015103A
51
+ XONLINE_S_LOGON_CONNECTION_ESTABLISHED = 0x001510F0
52
+ XONLINE_S_LOGON_DISCONNECTED = 0x001510F1
53
+ XONLINE_E_LOGON_SERVICE_NOT_REQUESTED = 0x80151100
54
+ XONLINE_E_LOGON_SERVICE_NOT_AUTHORIZED = 0x80151101
55
+ XONLINE_E_LOGON_SERVICE_TEMPORARILY_UNAVAILABLE = 0x80151102
56
+ XONLINE_E_LOGON_PPLOGIN_FAILED = 0x80151103
57
+ XONLINE_E_LOGON_SPONSOR_TOKEN_INVALID = 0x80151104
58
+ XONLINE_E_LOGON_SPONSOR_TOKEN_BANNED = 0x80151105
59
+ XONLINE_E_LOGON_SPONSOR_TOKEN_USAGE_EXCEEDED = 0x80151106
60
+ XONLINE_E_LOGON_FLASH_UPDATE_NOT_DOWNLOADED = 0x80151107
61
+ XONLINE_E_LOGON_UPDATE_NOT_DOWNLOADED = 0x80151108
62
+ XONLINE_E_LOGON_NOT_LOGGED_ON = 0x80151802
63
+ XONLINE_E_LOGON_DNS_LOOKUP_FAILED = 0x80151903
64
+ XONLINE_E_LOGON_DNS_LOOKUP_TIMEDOUT = 0x80151904
65
+ XONLINE_E_LOGON_MACS_FAILED = 0x80151906
66
+ XONLINE_E_LOGON_MACS_TIMEDOUT = 0x80151907
67
+ XONLINE_E_LOGON_AUTHENTICATION_TIMEDOUT = 0x80151909
68
+ XONLINE_E_LOGON_UNKNOWN_TITLE = 0x80151912
69
+ XONLINE_E_OFFERING_INVALID_CONSUME_ITEMS = 0x80153013
70
+ XONLINE_E_ACCOUNTS_NAME_TAKEN = 0x80154000
71
+ XONLINE_E_ACCOUNTS_INVALID_KINGDOM = 0x80154001
72
+ XONLINE_E_ACCOUNTS_INVALID_USER = 0x80154002
73
+ XONLINE_E_ACCOUNTS_BAD_CREDIT_CARD = 0x80154003
74
+ XONLINE_E_ACCOUNTS_BAD_BILLING_ADDRESS = 0x80154004
75
+ XONLINE_E_ACCOUNTS_ACCOUNT_BANNED = 0x80154005
76
+ XONLINE_E_ACCOUNTS_PERMISSION_DENIED = 0x80154006
77
+ XONLINE_E_ACCOUNTS_INVALID_VOUCHER = 0x80154007
78
+ XONLINE_E_ACCOUNTS_DATA_CHANGED = 0x80154008
79
+ XONLINE_E_ACCOUNTS_VOUCHER_ALREADY_USED = 0x80154009
80
+ XONLINE_E_ACCOUNTS_OPERATION_BLOCKED = 0x8015400A
81
+ XONLINE_E_ACCOUNTS_POSTAL_CODE_REQUIRED = 0x8015400B
82
+ XONLINE_E_ACCOUNTS_TRY_AGAIN_LATER = 0x8015400C
83
+ XONLINE_E_ACCOUNTS_NOT_A_RENEWAL_OFFER = 0x8015400D
84
+ XONLINE_E_ACCOUNTS_RENEWAL_IS_LOCKED = 0x8015400E
85
+ XONLINE_E_ACCOUNTS_VOUCHER_REQUIRED = 0x8015400F
86
+ XONLINE_E_ACCOUNTS_ALREADY_DEPROVISIONED = 0x80154010
87
+ XONLINE_E_ACCOUNTS_INVALID_PRIVILEGE = 0x80154011
88
+ XONLINE_E_ACCOUNTS_INVALID_SIGNED_PASSPORT_PUID = 0x80154012
89
+ XONLINE_E_ACCOUNTS_PASSPORT_ALREADY_LINKED = 0x80154013
90
+ XONLINE_E_ACCOUNTS_MIGRATE_NOT_XBOX1_USER = 0x80154014
91
+ XONLINE_E_ACCOUNTS_MIGRATE_BAD_SUBSCRIPTION = 0x80154015
92
+ XONLINE_E_ACCOUNTS_PASSPORT_NOT_LINKED = 0x80154016
93
+ XONLINE_E_ACCOUNTS_NOT_XENON_USER = 0x80154017
94
+ XONLINE_E_ACCOUNTS_CREDIT_CARD_REQUIRED = 0x80154018
95
+ XONLINE_E_ACCOUNTS_MIGRATE_NOT_XBOXCOM_USER = 0x80154019
96
+ XONLINE_E_ACCOUNTS_NOT_A_VOUCHER_OFFER = 0x8015401A
97
+ XONLINE_E_ACCOUNTS_REACHED_TRIAL_OFFER_LIMIT = 0x8015401B
98
+ XONLINE_E_ACCOUNTS_XBOX1_MANAGEMENT_BLOCKED = 0x8015401C
99
+ XONLINE_E_ACCOUNTS_OFFLINE_XUID_ALREADY_USED = 0x8015401D
100
+ XONLINE_E_ACCOUNTS_BILLING_PROVIDER_TIMEOUT = 0x8015401E
101
+ XONLINE_E_ACCOUNTS_MIGRATION_OFFER_NOT_FOUND = 0x8015401F
102
+ XONLINE_E_ACCOUNTS_UNDER_AGE = 0x80154020
103
+ XONLINE_E_ACCOUNTS_XBOX1_LOGON_BLOCKED = 0x80154021
104
+ XONLINE_E_ACCOUNTS_VOUCHER_INVALID_FOR_TIER = 0x80154022
105
+ XONLINE_E_ACCOUNTS_SWITCH_PASSPORT_QUEUED = 0x80154023
106
+ XONLINE_E_ACCOUNTS_SERVICE_NOT_PROVISIONED = 0x80154024
107
+ XONLINE_E_ACCOUNTS_ACCOUNT_UNBAN_BLOCKED = 0x80154025
108
+ XONLINE_E_ACCOUNTS_SWITCH_PASSPORT_INELIGIBLE = 0x80154026
109
+ XONLINE_E_ACCOUNTS_ADDITIONAL_DATA_REQUIRED = 0x80154027
110
+ XONLINE_E_ACCOUNTS_SWITCH_PASSPORT_SCS_PENDING = 0x80154028
111
+ XONLINE_E_ACCOUNTS_SWITCH_PASSPORT_NO_BIRTHDATE = 0x80154029
112
+ XONLINE_E_ACCOUNTS_SWITCH_PASSPORT_ADULT_TO_CHILD = 0x80154030
113
+ #XONLINE_E_ACCOUNTS_ WHAT ??? = 0x80154038
114
+ XONLINE_E_ACCOUNTS_USER_GET_ACCOUNT_INFO_ERROR = 0x80154098
115
+ XONLINE_E_ACCOUNTS_USER_OPTED_OUT = 0x80154099
116
+ XONLINE_E_MATCH_INVALID_SESSION_ID = 0x80155100
117
+ XONLINE_E_MATCH_INVALID_TITLE_ID = 0x80155101
118
+ XONLINE_E_MATCH_INVALID_DATA_TYPE = 0x80155102
119
+ XONLINE_E_MATCH_REQUEST_TOO_SMALL = 0x80155103
120
+ XONLINE_E_MATCH_REQUEST_TRUNCATED = 0x80155104
121
+ XONLINE_E_MATCH_INVALID_SEARCH_REQ = 0x80155105
122
+ XONLINE_E_MATCH_INVALID_OFFSET = 0x80155106
123
+ XONLINE_E_MATCH_INVALID_ATTR_TYPE = 0x80155107
124
+ XONLINE_E_MATCH_INVALID_VERSION = 0x80155108
125
+ XONLINE_E_MATCH_OVERFLOW = 0x80155109
126
+ XONLINE_E_MATCH_INVALID_RESULT_COL = 0x8015510A
127
+ XONLINE_E_MATCH_INVALID_STRING = 0x8015510B
128
+ XONLINE_E_MATCH_STRING_TOO_LONG = 0x8015510C
129
+ XONLINE_E_MATCH_BLOB_TOO_LONG = 0x8015510D
130
+ XONLINE_E_MATCH_INVALID_ATTRIBUTE_ID = 0x80155110
131
+ XONLINE_E_MATCH_SESSION_ALREADY_EXISTS = 0x80155112
132
+ XONLINE_E_MATCH_CRITICAL_DB_ERR = 0x80155115
133
+ XONLINE_E_MATCH_NOT_ENOUGH_COLUMNS = 0x80155116
134
+ XONLINE_E_MATCH_PERMISSION_DENIED = 0x80155117
135
+ XONLINE_E_MATCH_INVALID_PART_SCHEME = 0x80155118
136
+ XONLINE_E_MATCH_INVALID_PARAM = 0x80155119
137
+ XONLINE_E_MATCH_DATA_TYPE_MISMATCH = 0x8015511D
138
+ XONLINE_E_MATCH_SERVER_ERROR = 0x8015511E
139
+ XONLINE_E_MATCH_NO_USERS = 0x8015511F
140
+ XONLINE_E_MATCH_INVALID_BLOB = 0x80155120
141
+ XONLINE_E_MATCH_TOO_MANY_USERS = 0x80155121
142
+ XONLINE_E_MATCH_INVALID_FLAGS = 0x80155122
143
+ XONLINE_E_MATCH_PARAM_MISSING = 0x80155123
144
+ XONLINE_E_MATCH_TOO_MANY_PARAM = 0x80155124
145
+ XONLINE_E_MATCH_DUPLICATE_PARAM = 0x80155125
146
+ XONLINE_E_MATCH_TOO_MANY_ATTR = 0x80155126
147
+ XONLINE_E_SESSION_NOT_FOUND = 0x80155200
148
+ XONLINE_E_SESSION_INSUFFICIENT_PRIVILEGES = 0x80155201
149
+ XONLINE_E_SESSION_FULL = 0x80155202
150
+ XONLINE_E_SESSION_INVITES_DISABLED = 0x80155203
151
+ XONLINE_E_SESSION_INVALID_FLAGS = 0x80155204
152
+ XONLINE_E_SESSION_REQUIRES_ARBITRATION = 0x80155205
153
+ XONLINE_E_SESSION_WRONG_STATE = 0x80155206
154
+ XONLINE_E_SESSION_INSUFFICIENT_BUFFER = 0x80155207
155
+ XONLINE_E_SESSION_REGISTRATION_ERROR = 0x80155208
156
+ XONLINE_E_SESSION_NOT_LOGGED_ON = 0x80155209
157
+ XONLINE_E_SESSION_JOIN_ILLEGAL = 0x8015520A
158
+ XONLINE_E_SESSION_CREATE_KEY_FAILED = 0x8015520B
159
+ XONLINE_E_SESSION_NOT_REGISTERED = 0x8015520C
160
+ XONLINE_E_SESSION_REGISTER_KEY_FAILED = 0x8015520D
161
+ XONLINE_E_SESSION_UNREGISTER_KEY_FAILED = 0x8015520E
162
+ XONLINE_E_QUERY_QUOTA_FULL = 0x80156101
163
+ XONLINE_E_QUERY_ENTITY_NOT_FOUND = 0x80156102
164
+ XONLINE_E_QUERY_PERMISSION_DENIED = 0x80156103
165
+ XONLINE_E_QUERY_ATTRIBUTE_TOO_LONG = 0x80156104
166
+ XONLINE_E_QUERY_UNEXPECTED_ATTRIBUTE = 0x80156105
167
+ XONLINE_E_QUERY_INVALID_ACTION = 0x80156107
168
+ XONLINE_E_QUERY_SPEC_COUNT_MISMATCH = 0x80156108
169
+ XONLINE_E_QUERY_DATASET_NOT_FOUND = 0x80156109
170
+ XONLINE_E_QUERY_PROCEDURE_NOT_FOUND = 0x8015610A
171
+ XONLINE_E_COMP_ACCESS_DENIED = 0x80156202
172
+ XONLINE_E_COMP_REGISTRATION_CLOSED = 0x80156203
173
+ XONLINE_E_COMP_FULL = 0x80156204
174
+ XONLINE_E_COMP_NOT_REGISTERED = 0x80156205
175
+ XONLINE_E_COMP_CANCELLED = 0x80156206
176
+ XONLINE_E_COMP_CHECKIN_TIME_INVALID = 0x80156207
177
+ XONLINE_E_COMP_CHECKIN_BAD_EVENT = 0x80156208
178
+ XONLINE_E_COMP_EVENT_SCORED = 0x80156209
179
+ XONLINE_S_COMP_EVENT_SCORED = 0x00156209
180
+ XONLINE_E_COMP_UNEXPECTED = 0x80156210
181
+ XONLINE_E_COMP_TOPOLOGY_ERROR = 0x80156216
182
+ XONLINE_E_COMP_TOPOLOGY_PENDING = 0x80156217
183
+ XONLINE_E_COMP_CHECKIN_TOO_EARLY = 0x80156218
184
+ XONLINE_E_COMP_ALREADY_REGISTERED = 0x80156219
185
+ XONLINE_E_COMP_INVALID_ENTRANT_TYPE = 0x8015621A
186
+ XONLINE_E_COMP_TOO_LATE = 0x8015621B
187
+ XONLINE_E_COMP_TOO_EARLY = 0x8015621C
188
+ XONLINE_E_COMP_NO_BYES_AVAILABLE = 0x8015621D
189
+ XONLINE_E_COMP_SERVICE_OUTAGE = 0x8015621E
190
+ XONLINE_E_MSGSVR_INVALID_REQUEST = 0x80157001
191
+ XONLINE_E_STRING_TOO_LONG = 0x80157101
192
+ XONLINE_E_STRING_OFFENSIVE_TEXT = 0x80157102
193
+ XONLINE_E_STRING_NO_DEFAULT_STRING = 0x80157103
194
+ XONLINE_E_STRING_INVALID_LANGUAGE = 0x80157104
195
+ XONLINE_E_FEEDBACK_NULL_TARGET = 0x80158001
196
+ XONLINE_E_FEEDBACK_BAD_TYPE = 0x80158002
197
+ XONLINE_E_FEEDBACK_CANNOT_LOG = 0x80158006
198
+ XONLINE_E_STAT_BAD_REQUEST = 0x80159001
199
+ XONLINE_E_STAT_INVALID_TITLE_OR_LEADERBOARD = 0x80159002
200
+ XONLINE_E_STAT_TOO_MANY_SPECS = 0x80159004
201
+ XONLINE_E_STAT_TOO_MANY_STATS = 0x80159005
202
+ XONLINE_E_STAT_USER_NOT_FOUND = 0x80159003
203
+ XONLINE_E_STAT_SET_FAILED_0 = 0x80159100
204
+ XONLINE_E_STAT_PERMISSION_DENIED = 0x80159200
205
+ XONLINE_E_STAT_LEADERBOARD_WAS_RESET = 0x80159201
206
+ XONLINE_E_STAT_INVALID_ATTACHMENT = 0x80159202
207
+ XONLINE_S_STAT_CAN_UPLOAD_ATTACHMENT = 0x00159203
208
+ XONLINE_E_STAT_TOO_MANY_PARAMETERS = 0x80159204
209
+ XONLINE_E_STAT_TOO_MANY_PROCEDURES = 0x80159205
210
+ XONLINE_E_STAT_STAT_POST_PROC_ERROR = 0x80159206
211
+ XONLINE_E_STAT_NOT_ENOUGH_PARAMETERS = 0x80159208
212
+ XONLINE_E_STAT_INVALID_PROCEDURE = 0x80159209
213
+ XONLINE_E_STAT_EXCEEDED_WRITE_READ_LIMIT = 0x8015920A
214
+ XONLINE_E_STAT_LEADERBOARD_READONLY = 0x8015920B
215
+ XONLINE_E_STAT_MUSIGMA_ARITHMETIC_OVERFLOW = 0x8015920C
216
+ XONLINE_E_STAT_READ_NO_SPEC = 0x8015920D
217
+ XONLINE_E_STAT_MUSIGMA_NO_GAME_MODE = 0x8015920E
218
+ XONLINE_E_SIGNATURE_ERROR = 0x8015B000
219
+ XONLINE_E_SIGNATURE_VER_INVALID_SIGNATURE = 0x8015B001
220
+ XONLINE_E_SIGNATURE_VER_UNKNOWN_KEY_VER = 0x8015B002
221
+ XONLINE_E_SIGNATURE_VER_UNKNOWN_SIGNATURE_VER = 0x8015B003
222
+ XONLINE_E_SIGNATURE_BANNED_XBOX = 0x8015B004
223
+ XONLINE_E_SIGNATURE_BANNED_USER = 0x8015B005
224
+ XONLINE_E_SIGNATURE_BANNED_TITLE = 0x8015B006
225
+ XONLINE_E_SIGNATURE_BANNED_DIGEST = 0x8015B007
226
+ XONLINE_E_SIGNATURE_GET_BAD_AUTH_DATA = 0x8015B008
227
+ XONLINE_E_SIGNATURE_SERVICE_UNAVAILABLE = 0x8015B009
228
+ XONLINE_E_ARBITRATION_SERVICE_UNAVAILABLE = 0x8015B101
229
+ XONLINE_E_ARBITRATION_INVALID_REQUEST = 0x8015B102
230
+ XONLINE_E_ARBITRATION_SESSION_NOT_FOUND = 0x8015B103
231
+ XONLINE_E_ARBITRATION_REGISTRATION_FLAGS_MISMATCH = 0x8015B104
232
+ XONLINE_E_ARBITRATION_REGISTRATION_SESSION_TIME_MISMATCH = 0x8015B105
233
+ XONLINE_E_ARBITRATION_REGISTRATION_TOO_LATE = 0x8015B106
234
+ XONLINE_E_ARBITRATION_NEED_TO_REGISTER_FIRST = 0x8015B107
235
+ XONLINE_E_ARBITRATION_TIME_EXTENSION_NOT_ALLOWED = 0x8015B108
236
+ XONLINE_E_ARBITRATION_INCONSISTENT_FLAGS = 0x8015B109
237
+ XONLINE_E_ARBITRATION_INCONSISTENT_COMPETITION_STATUS = 0x8015B10A
238
+ XONLINE_E_ARBITRATION_REPORT_ALREADY_CALLED = 0x8015B10B
239
+ XONLINE_E_ARBITRATION_TOO_MANY_XBOXES_IN_SESSION = 0x8015B10C
240
+ XONLINE_E_ARBITRATION_1_XBOX_1_USER_SESSION_NOT_ALLOWED = 0x8015B10D
241
+ XONLINE_E_ARBITRATION_REPORT_TOO_LARGE = 0x8015B10E
242
+ XONLINE_E_ARBITRATION_INVALID_TEAMTICKET = 0x8015B10F
243
+ XONLINE_S_ARBITRATION_INVALID_XBOX_SPECIFIED = 0x0015B1F0
244
+ XONLINE_S_ARBITRATION_INVALID_USER_SPECIFIED = 0x0015B1F1
245
+ XONLINE_S_ARBITRATION_DIFFERENT_RESULTS_DETECTED = 0x0015B1F2
246
+ XONLINE_E_STORAGE_INVALID_REQUEST = 0x8015C001
247
+ XONLINE_E_STORAGE_ACCESS_DENIED = 0x8015C002
248
+ XONLINE_E_STORAGE_FILE_IS_TOO_BIG = 0x8015C003
249
+ XONLINE_E_STORAGE_FILE_NOT_FOUND = 0x8015C004
250
+ XONLINE_E_STORAGE_INVALID_ACCESS_TOKEN = 0x8015C005
251
+ XONLINE_E_STORAGE_CANNOT_FIND_PATH = 0x8015C006
252
+ XONLINE_E_STORAGE_FILE_IS_ELSEWHERE = 0x8015C007
253
+ XONLINE_E_STORAGE_INVALID_STORAGE_PATH = 0x8015C008
254
+ XONLINE_E_STORAGE_INVALID_FACILITY = 0x8015C009
255
+ XONLINE_E_STORAGE_UNKNOWN_DOMAIN = 0x8015C00A
256
+ XONLINE_E_STORAGE_SYNC_TIME_SKEW = 0x8015C00B
257
+ XONLINE_E_STORAGE_SYNC_TIME_SKEW_LOCALTIME = 0x8015C00C
258
+ XONLINE_E_STORAGE_QUOTA_EXCEEDED = 0x8015C00D
259
+ XONLINE_E_STORAGE_FILE_ALREADY_EXISTS = 0x8015C011
260
+ XONLINE_E_STORAGE_DATABASE_ERROR = 0x8015C012
261
+ XONLINE_S_STORAGE_FILE_NOT_MODIFIED = 0x0015C013
262
+ XONLINE_E_STORAGE_UNSUPPORTED_CONTENT_TYPE = 0x8015CA0E
263
+ end
264
+ end
265
+
266
+ module WGX
267
+ module HRESULT
268
+ WGX_E_OUT_OF_TOKENS = 0x80170101
269
+ WGX_E_OUT_OF_ACTIVATION_KEY = 0x80170102
270
+ WGX_E_TITLE_NOT_PURCHASED = 0x80170103
271
+ WGX_E_TITLE_NOT_FOUND = 0x80170104
272
+ WGX_E_OFFER_NOT_FOUND = 0x80170105
273
+ WGX_E_UNKNOWN = 0x80170107
274
+ end
275
+ end
276
+ end
277
+
278
+ module WinCommon::Errors::HRESULT
279
+ include XLiveServices::XOnline::HRESULT
280
+ include XLiveServices::WGX::HRESULT
281
+ end
@@ -0,0 +1,79 @@
1
+ require 'savon'
2
+ require 'base64'
3
+
4
+ module XLiveServices
5
+ class MarketplacePublic
6
+ extend Savon::Model
7
+ client endpoint: '', namespace: 'http://tempuri.org/'
8
+ global :env_namespace, :s
9
+ global :namespace_identifier, :t
10
+ global :convert_request_keys_to, :none
11
+ global :element_form_default, :qualified
12
+ global :convert_response_tags_to, :camelcase
13
+ global :soap_version, 2
14
+ global :namespaces, { 'xmlns:a' => 'http://www.w3.org/2005/08/addressing' }
15
+
16
+ ConfigurationName = 'IMarketplacePublic'
17
+
18
+ module SortField
19
+ Title = :Title
20
+ AvailabilityDate = :AvailabilityDate
21
+ LastPlayedDate = :LastPlayedDate
22
+ end
23
+
24
+ def initialize(endpoint, wgxService)
25
+ @WgxService = wgxService
26
+ client.globals[:endpoint] = endpoint
27
+ end
28
+
29
+ def self.BuildOfferGUID(offerID, titleID=nil)
30
+ titleID = offerID >> 32 if titleID.nil?
31
+ offerID &= 0xffffffff
32
+ "%08x-0000-4000-8000-0000%08x" % [offerID, titleID]
33
+ end
34
+
35
+ def BuildOfferGUID(offerID, titleID=nil)
36
+ self.class.BuildOfferGUID(offerID, titleID)
37
+ end
38
+
39
+ def GetHeader(name)
40
+ Utils::BuildHeader(client.globals[:endpoint], Utils::BuildAction(client.globals[:namespace], ConfigurationName, name.to_s), @WgxService.Token)
41
+ end
42
+
43
+ def GetPurchaseHistory(locale, pageNum = 1, orderBy = SortField::Title)
44
+ client.globals[:soap_header] = GetHeader(__callee__)
45
+ client.call __callee__, message: { locale: locale, pageNum: pageNum, orderBy: Utils::Serialization::Serialize('enum', orderBy) }
46
+ end
47
+
48
+ def ReadUserSettings(titleID, settings)
49
+ client.globals[:soap_header] = GetHeader(__callee__)
50
+ client.call __callee__, message: { titleID: titleID, settings: Utils::Serialization::Serialize('uint[]', settings) }
51
+ end
52
+
53
+ def GetOfferDetailsPublic(locale, offerGUID)
54
+ client.globals[:soap_header] = GetHeader(__callee__)
55
+ client.call __callee__, message: { locale: locale, offerId: offerGUID }
56
+ end
57
+
58
+ def GetLicensePublic(offerGUID)
59
+ client.globals[:soap_header] = GetHeader(__callee__)
60
+ client.call __callee__, message: { offerId: offerGUID }
61
+ end
62
+
63
+ def GetSponsorToken(titleId)
64
+ client.globals[:soap_header] = GetHeader(__callee__)
65
+ client.call __callee__, message: { titleId: titleId }
66
+ end
67
+
68
+ def GetActivationKey(offerGUID)
69
+ client.globals[:soap_header] = GetHeader(__callee__)
70
+ client.call __callee__, message: { offerId: offerGUID }
71
+ end
72
+
73
+ def GetMediaUrls(urls, offerGUID)
74
+ client.globals[:soap_header] = GetHeader(__callee__)
75
+ client.call __callee__, message: { urls: Utils::Serialization::Serialize('string[]', urls), offerID: offerGUID }
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,38 @@
1
+ require 'builder/xchar'
2
+
3
+ module XLiveServices
4
+ module Utils
5
+ def self.BuildHeader(endpoint, action, compactRPSTicket)
6
+ %{
7
+ <a:Action s:mustUnderstand="1">#{action}</a:Action>
8
+ <a:To s:mustUnderstand="1">#{endpoint}</a:To>
9
+ <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
10
+ <cct:RpsSecurityToken wsu:Id="00000000-0000-0000-0000-000000000000" xmlns:cct="http://samples.microsoft.com/wcf/security/Extensibility/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
11
+ <cct:RpsTicket>#{Builder::XChar.encode(compactRPSTicket)}</cct:RpsTicket>
12
+ </cct:RpsSecurityToken>
13
+ </o:Security>
14
+ }
15
+ end
16
+
17
+ def self.BuildAction(namespace, configurationName, name)
18
+ namespace + configurationName + '/' + name
19
+ end
20
+
21
+ class Serialization
22
+ def self.Serialize(type, data)
23
+ serialized = {}
24
+ case type
25
+ when 'enum'
26
+ serialized = data.to_s
27
+ when 'uint[]'
28
+ serialized[:'@xmlns:b'] = 'http://schemas.microsoft.com/2003/10/Serialization/Arrays'
29
+ serialized[:content!] = { 'b:unsignedInt' => data }
30
+ when 'string[]'
31
+ serialized[:'@xmlns:b'] = 'http://schemas.microsoft.com/2003/10/Serialization/Arrays'
32
+ serialized[:content!] = { 'b:string' => data }
33
+ end
34
+ serialized
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module XLiveServices
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,77 @@
1
+ module XLiveServices
2
+ class XLive
3
+ LiveIdGUID = '{D34F9E47-A73B-44E5-AE67-5D0D8B8CFA76}'
4
+ LiveIdVersion = 1
5
+ attr_reader :Locale
6
+ attr_reader :Config
7
+ attr_reader :Live
8
+ attr_reader :Identity
9
+ attr_reader :Username
10
+ def initialize(username = nil, password = nil, locale = nil)
11
+ @Locale = 'en-US'
12
+ @Locale = locale if locale
13
+ @Config = XLiveServices.GetLcwConfig(@Locale)
14
+ @Live = LiveIdentity.new(LiveIdGUID, LiveIdVersion, :NO_UI, { :IDCRL_OPTION_ENVIRONMENT => 'Production' })
15
+
16
+ if username.nil?
17
+ identities = @Live.GetIdentities(LiveIdentity::PPCRL_CREDTYPE_PASSWORD)
18
+ @Username = identities.GetNextIdentityName
19
+ if !@Username
20
+ identities = @Live.GetIdentities(LiveIdentity::PPCRL_CREDTYPE_MEMBERNAMEONLY)
21
+ @Username = identities.GetNextIdentityName
22
+ end
23
+ raise XLiveServicesError.new('No Username!') unless @Username
24
+ else
25
+ @Username = username
26
+ end
27
+
28
+ @Identity = @Live.GetIdentity(@Username, :IDENTITY_SHARE_ALL)
29
+ if !@Identity.HasPersistedCredential?(LiveIdentity::PPCRL_CREDTYPE_MEMBERNAMEONLY)
30
+ @Identity.SetCredential(LiveIdentity::PPCRL_CREDTYPE_MEMBERNAMEONLY, @Username)
31
+ end
32
+
33
+ if password
34
+ @Identity.SetCredential(LiveIdentity::PPCRL_CREDTYPE_PASSWORD, password)
35
+ elsif !@Identity.HasPersistedCredential?(LiveIdentity::PPCRL_CREDTYPE_PASSWORD)
36
+ raise XLiveServicesError.new("No Password for #{@Username}!")
37
+ end
38
+ end
39
+
40
+ def PersistCredentials
41
+ @Identity.PersistCredential(LiveIdentity::PPCRL_CREDTYPE_MEMBERNAMEONLY)
42
+ @Identity.PersistCredential(LiveIdentity::PPCRL_CREDTYPE_PASSWORD)
43
+ end
44
+
45
+ def RemovePersistedCredentials
46
+ @Identity.RemovePersistedCredential(LiveIdentity::PPCRL_CREDTYPE_PASSWORD)
47
+ @Identity.RemovePersistedCredential(LiveIdentity::PPCRL_CREDTYPE_MEMBERNAMEONLY)
48
+ end
49
+
50
+ def IsAuthenticated?
51
+ @Identity.IsAuthenticated?
52
+ end
53
+
54
+ def Authenticate
55
+ return if IsAuthenticated?()
56
+ @Identity.Authenticate(nil, :LOGONIDENTITY_ALLOW_PERSISTENT_COOKIES)
57
+ end
58
+
59
+ def GetUserAuthService
60
+ @GetUserAuthService ||= XLiveServices.GetUserAuthService(@Identity, @Config)
61
+ end
62
+
63
+ def GetUserAuthorizationInfo
64
+ userAuthorization = XLiveServices.GetUserAuthorization(@Config[:URL][:GetUserAuth].first, GetUserAuthService())
65
+ userAuthorization['GetUserAuthorizationInfo']
66
+ end
67
+
68
+ def GetWgxService
69
+ @WgxService ||= XLiveServices.GetWgxService(@Identity, @Config)
70
+ end
71
+
72
+ def GetMarketplace
73
+ # Alternative service url https://services.gamesforwindows.com/SecurePublic/MarketplaceRestSecure.svc
74
+ XLiveServices::MarketplacePublic.new(@Config[:URL][:WgxService].first, GetWgxService())
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,57 @@
1
+ require 'httpi'
2
+ require 'multi_xml'
3
+ require 'live_identity'
4
+
5
+ module XLiveServices
6
+ class XLiveServicesError < RuntimeError; end
7
+
8
+ def self.GetLcwConfig(locale = 'en-US')
9
+ raise XLiveServicesError.new('Invalid Locale!') if locale.nil? or locale.empty?
10
+ response = HTTPI.get(HTTPI::Request.new("https://live.xbox.com/#{locale}/GetLcwConfig.ashx"))
11
+ raise "Error! HTTP Status Code: #{response.code}" if response.error?
12
+ XLiveServices.ParseConfig(MultiXml.parse(response.body))
13
+ end
14
+
15
+ def self.ParseConfig(config)
16
+ parsed = { :Auth => {}, :URL => {} }
17
+ config['Environment']['Authentication']['AuthSetting'].each do |setting|
18
+ parsed[:Auth][setting['name'].to_sym] = { ServiceName: setting['serviceName'], Policy: setting['policy'].to_sym }
19
+ end
20
+ config['Environment']['UrlSettings']['UrlSetting'].each do |setting|
21
+ parsed[:URL][setting['name'].to_sym] = [ setting['url'], setting['authKey'].empty? ? nil : setting['authKey'].to_sym ]
22
+ end
23
+ parsed
24
+ end
25
+
26
+ def self.DoAuth(identity, serviceName, policy)
27
+ identity.GetService(serviceName, policy)
28
+ end
29
+
30
+ def self.GetUserAuthService(identity, config)
31
+ configData = config[:Auth][config[:URL][:GetUserAuth].last]
32
+ DoAuth(identity, configData[:ServiceName], configData[:Policy])
33
+ end
34
+
35
+ def self.GetWgxService(identity, config)
36
+ configData = config[:Auth][config[:URL][:WgxService].last]
37
+ DoAuth(identity, configData[:ServiceName], configData[:Policy])
38
+ end
39
+
40
+ def self.GetUserAuthorization(url, userAuthService)
41
+ raise XLiveServicesError.new('Invalid AuthService Token!') if userAuthService.Token.nil? or userAuthService.Token.empty?
42
+ request = HTTPI::Request.new(url)
43
+ request.body = { :serviceType => 1, :titleId => 0 }
44
+ request.headers['Authorization'] = "WLID1.0 #{userAuthService.Token}"
45
+ request.headers['X-ClientType'] = 'panorama'
46
+ response = HTTPI.post(request)
47
+ raise "Error! HTTP Status Code: #{response.code} #{response.body}" if response.error?
48
+ MultiXml.parse(response.body)
49
+ end
50
+
51
+ def self.UserLogout(config)
52
+ request = HTTPI::Request.new(config[:URL][:Logout].first)
53
+ response = HTTPI.get(request)
54
+ raise XLiveServicesError.new("Error! HTTP Status Code: #{response.code} #{response.body}") if response.error?
55
+ response.body
56
+ end
57
+ end
@@ -0,0 +1,10 @@
1
+ require 'pathname'
2
+
3
+ ENV['SSL_CERT_FILE'] = Pathname.new("#{File.dirname(__FILE__)}/../data/certs.pem").realpath.to_s
4
+
5
+ require 'xlive_services/version'
6
+ require 'xlive_services/utils'
7
+ require 'xlive_services/xlive_services'
8
+ require 'xlive_services/marketplace_public'
9
+ require 'xlive_services/xlive'
10
+ require 'xlive_services/hresult'
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+ require 'simplecov'
3
+
4
+ SimpleCov.start
5
+ require_relative '../lib/xlive_services'
@@ -0,0 +1,6 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe XLiveServices do
5
+
6
+ end
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: XLiveServices
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dāvis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httpi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
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: multi_xml
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: LiveIdentity
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: savon
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
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: builder
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
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: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
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: rspec
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: yard
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
+ description: A library to consume Xbox LIVE and Games for Windows LIVE services.
154
+ email:
155
+ - davispuh@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".travis.yml"
162
+ - ".yardopts"
163
+ - Gemfile
164
+ - README.md
165
+ - Rakefile
166
+ - UNLICENSE
167
+ - XLiveServices.gemspec
168
+ - data/certs.pem
169
+ - lib/xlive_services.rb
170
+ - lib/xlive_services/hresult.rb
171
+ - lib/xlive_services/marketplace_public.rb
172
+ - lib/xlive_services/utils.rb
173
+ - lib/xlive_services/version.rb
174
+ - lib/xlive_services/xlive.rb
175
+ - lib/xlive_services/xlive_services.rb
176
+ - spec/spec_helper.rb
177
+ - spec/xlive_services_spec.rb
178
+ homepage: https://github.com/davispuh/XLiveServices
179
+ licenses:
180
+ - UNLICENSE
181
+ metadata: {}
182
+ post_install_message:
183
+ rdoc_options: []
184
+ require_paths:
185
+ - lib
186
+ required_ruby_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ required_rubygems_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ requirements: []
197
+ rubyforge_project:
198
+ rubygems_version: 2.2.2
199
+ signing_key:
200
+ specification_version: 4
201
+ summary: Interact with Xbox LIVE and Games for Windows LIVE services.
202
+ test_files:
203
+ - spec/spec_helper.rb
204
+ - spec/xlive_services_spec.rb
205
+ has_rdoc: