summaryrefslogtreecommitdiffstats
path: root/o3d/installer
diff options
context:
space:
mode:
authorgspencer@google.com <gspencer@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-27 23:15:42 +0000
committergspencer@google.com <gspencer@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-27 23:15:42 +0000
commit05b47f7a8c5451f858dc220df0e3a97542edace6 (patch)
treea2273d619f0625c9d44d40842845ccce2eac1045 /o3d/installer
parent5cdc8bdb4c847cefe7f4542bd10c9880c2c557a0 (diff)
downloadchromium_src-05b47f7a8c5451f858dc220df0e3a97542edace6.zip
chromium_src-05b47f7a8c5451f858dc220df0e3a97542edace6.tar.gz
chromium_src-05b47f7a8c5451f858dc220df0e3a97542edace6.tar.bz2
This is the O3D source tree's initial commit to the Chromium tree. It
is not built or referenced at all by the chrome build yet, and doesn't yet build in it's new home. We'll change that shortly. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17035 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/installer')
-rw-r--r--o3d/installer/mac/O3D_Stats/English.lproj/InfoPlist.strings5
-rw-r--r--o3d/installer/mac/O3D_Stats/English.lproj/Localizable.strings3
-rw-r--r--o3d/installer/mac/O3D_Stats/English.lproj/O3D_Stats.xib586
-rw-r--r--o3d/installer/mac/O3D_Stats/Info.plist32
-rw-r--r--o3d/installer/mac/O3D_Stats/InstallerSections.plist16
-rw-r--r--o3d/installer/mac/O3D_Stats/O3D_Stats.xcodeproj/project.pbxproj291
-rw-r--r--o3d/installer/mac/O3D_Stats/O3D_StatsPane.h54
-rw-r--r--o3d/installer/mac/O3D_Stats/O3D_StatsPane.m67
-rw-r--r--o3d/installer/mac/O3D_Stats/O3D_Stats_Prefix.pch7
-rw-r--r--o3d/installer/mac/O3D_Stats/version.plist14
-rw-r--r--o3d/installer/win/build.scons207
-rw-r--r--o3d/installer/win/custom_actions.cc326
-rw-r--r--o3d/installer/win/docs.url4
-rw-r--r--o3d/installer/win/driver_blacklist.txt12
-rw-r--r--o3d/installer/win/o3d_extras.wxs120
-rw-r--r--o3d/installer/win/o3d_kill_version.py6
-rw-r--r--o3d/installer/win/o3d_plugin.wxs345
-rw-r--r--o3d/installer/win/o3d_sdk.wxs223
-rw-r--r--o3d/installer/win/o3d_version.py6
19 files changed, 2324 insertions, 0 deletions
diff --git a/o3d/installer/mac/O3D_Stats/English.lproj/InfoPlist.strings b/o3d/installer/mac/O3D_Stats/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000..a03f1e5
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/English.lproj/InfoPlist.strings
@@ -0,0 +1,5 @@
+/* Localized versions of Info.plist keys */
+
+
+NSHumanReadableCopyright = "© Google Inc, 2009";
+InstallerSectionTitle = "Statistics";
diff --git a/o3d/installer/mac/O3D_Stats/English.lproj/Localizable.strings b/o3d/installer/mac/O3D_Stats/English.lproj/Localizable.strings
new file mode 100644
index 0000000..3aef4d4
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/English.lproj/Localizable.strings
@@ -0,0 +1,3 @@
+/* Localized versions of Info.plist keys */
+
+"PaneTitle" = "Statistics";
diff --git a/o3d/installer/mac/O3D_Stats/English.lproj/O3D_Stats.xib b/o3d/installer/mac/O3D_Stats/English.lproj/O3D_Stats.xib
new file mode 100644
index 0000000..e5302b2
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/English.lproj/O3D_Stats.xib
@@ -0,0 +1,586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+ <data>
+ <int key="IBDocument.SystemTarget">0</int>
+ <string key="IBDocument.SystemVersion">9G55</string>
+ <string key="IBDocument.InterfaceBuilderVersion">677</string>
+ <string key="IBDocument.AppKitVersion">949.43</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="8"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="995885815">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="533019728">
+ <string key="NSClassName">InstallerSection</string>
+ </object>
+ <object class="NSCustomObject" id="304932500">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="521373648">
+ <string key="NSClassName">O3D_StatsPane</string>
+ </object>
+ <object class="NSCustomView" id="878039515">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="566423633">
+ <reference key="NSNextResponder" ref="878039515"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 282}, {384, 28}}</string>
+ <reference key="NSSuperview" ref="878039515"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="809567365">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">272629760</int>
+ <string key="NSContents">Help us improve O3D</string>
+ <object class="NSFont" key="NSSupport" id="316557201">
+ <string key="NSName">LucidaGrande-Bold</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="566423633"/>
+ <object class="NSColor" key="NSBackgroundColor" id="222943333">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="20271656">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="760275755">
+ <reference key="NSNextResponder" ref="878039515"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 217}, {384, 57}}</string>
+ <reference key="NSSuperview" ref="878039515"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="386271124">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">272629760</int>
+ <string key="NSContents">When you enable statistics, non-personal technical data will be automatically sent to Google to help us improve O3D.</string>
+ <object class="NSFont" key="NSSupport" id="223084996">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="760275755"/>
+ <reference key="NSBackgroundColor" ref="222943333"/>
+ <reference key="NSTextColor" ref="20271656"/>
+ </object>
+ </object>
+ <object class="NSMatrix" id="1021698340">
+ <reference key="NSNextResponder" ref="878039515"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{119, 130}, {190, 64}}</string>
+ <reference key="NSSuperview" ref="878039515"/>
+ <bool key="NSEnabled">YES</bool>
+ <int key="NSNumRows">2</int>
+ <int key="NSNumCols">1</int>
+ <object class="NSMutableArray" key="NSCells">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButtonCell" id="1007645086">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Enable statistics</string>
+ <reference key="NSSupport" ref="223084996"/>
+ <int key="NSTag">1</int>
+ <reference key="NSControlView" ref="1021698340"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">128</int>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="899163449">
+ <string key="NSImageName">NSRadioButton</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ <object class="NSButtonCell" id="291237987">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Disable statistics</string>
+ <reference key="NSSupport" ref="223084996"/>
+ <reference key="NSControlView" ref="1021698340"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">128</int>
+ <object class="NSImage" key="NSNormalImage">
+ <int key="NSImageFlags">549453824</int>
+ <string key="NSSize">{18, 18}</string>
+ <object class="NSMutableArray" key="NSReps">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="0" id="8"/>
+ <object class="NSBitmapImageRep">
+ <object class="NSData" key="NSTIFFRepresentation">
+ <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw
+IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/
+29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5
+dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA
+AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG
+AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/
+0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/
+7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/
+5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/
+3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD
+AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns
+AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/
+6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/
+/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/
+///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl
+YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA
+AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD
+AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu
+AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB
+AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES
+AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABBxwAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS
+AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw
+cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAPbWAAEAAAAA0y1hcHBs2U706y3Sst1fqit5+wYbUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA
+AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA
+BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA
+AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA
+AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1
+cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD
+AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH
+SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF
+hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8
+vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt
+7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq
+Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo
+aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e
+n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX
+2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW
+FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O
+Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6
+ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt
+rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA
+AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA
+AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl
+A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq
+DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU
+HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8
+MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v
+UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/
+eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj
+rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn
+5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh
+AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK
+CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY
+GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95
+MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S
+UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2
+d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV
+pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK
+0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf//
+AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw
+BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA
+FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H
+LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh
+Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ
+h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp
+svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb
+1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX
+8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE
+AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg
+QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSColor" key="NSColor" id="440852265">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwAA</bytes>
+ </object>
+ </object>
+ <reference key="NSAlternateImage" ref="899163449"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ </object>
+ <string key="NSCellSize">{190, 31}</string>
+ <string key="NSIntercellSpacing">{4, 2}</string>
+ <int key="NSMatrixFlags">1151868928</int>
+ <string key="NSCellClass">NSActionCell</string>
+ <object class="NSButtonCell" key="NSProtoCell" id="916470276">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Radio</string>
+ <reference key="NSSupport" ref="223084996"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">128</int>
+ <object class="NSImage" key="NSNormalImage">
+ <int key="NSImageFlags">549453824</int>
+ <string key="NSSize">{18, 18}</string>
+ <object class="NSMutableArray" key="NSReps">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="8"/>
+ <object class="NSBitmapImageRep">
+ <object class="NSData" key="NSTIFFRepresentation">
+ <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw
+IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/
+29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5
+dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA
+AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG
+AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/
+0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/
+7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/
+5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/
+3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD
+AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns
+AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/
+6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/
+/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/
+///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl
+YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA
+AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD
+AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu
+AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB
+AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES
+AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABBxwAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS
+AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <reference key="NSColor" ref="440852265"/>
+ </object>
+ <reference key="NSAlternateImage" ref="899163449"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ <reference key="NSSelectedCell" ref="1007645086"/>
+ <reference key="NSBackgroundColor" ref="222943333"/>
+ <object class="NSColor" key="NSCellBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <reference key="NSFont" ref="316557201"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{418, 330}</string>
+ <reference key="NSSuperview"/>
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSView</characters>
+ </object>
+ <string key="NSExtension">NSResponder</string>
+ </object>
+ <object class="NSCustomObject" id="330240596">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">firstPane</string>
+ <reference key="source" ref="533019728"/>
+ <reference key="destination" ref="521373648"/>
+ </object>
+ <int key="connectionID">6</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">parentSection</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="533019728"/>
+ </object>
+ <int key="connectionID">7</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">contentView</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="878039515"/>
+ </object>
+ <int key="connectionID">9</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statsOnRadio</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="1007645086"/>
+ </object>
+ <int key="connectionID">19</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statsOffRadio</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="291237987"/>
+ </object>
+ <int key="connectionID">20</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statsRadioMatrix</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="1021698340"/>
+ </object>
+ <int key="connectionID">21</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statsOnRadio_</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="1007645086"/>
+ </object>
+ <int key="connectionID">22</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statsOffRadio_</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="291237987"/>
+ </object>
+ <int key="connectionID">23</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statsRadioMatrix_</string>
+ <reference key="source" ref="521373648"/>
+ <reference key="destination" ref="1021698340"/>
+ </object>
+ <int key="connectionID">24</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="995885815"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="533019728"/>
+ <reference key="parent" ref="0"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="304932500"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="521373648"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">O3D_StatsPane</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">8</int>
+ <reference key="object" ref="878039515"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="566423633"/>
+ <reference ref="760275755"/>
+ <reference ref="1021698340"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">View</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="330240596"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="566423633"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="809567365"/>
+ </object>
+ <reference key="parent" ref="878039515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">12</int>
+ <reference key="object" ref="809567365"/>
+ <reference key="parent" ref="566423633"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="760275755"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="386271124"/>
+ </object>
+ <reference key="parent" ref="878039515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="386271124"/>
+ <reference key="parent" ref="760275755"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="1021698340"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="916470276"/>
+ <reference ref="291237987"/>
+ <reference ref="1007645086"/>
+ </object>
+ <reference key="parent" ref="878039515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">16</int>
+ <reference key="object" ref="916470276"/>
+ <reference key="parent" ref="1021698340"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">17</int>
+ <reference key="object" ref="291237987"/>
+ <reference key="parent" ref="1021698340"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">18</int>
+ <reference key="object" ref="1007645086"/>
+ <reference key="parent" ref="1021698340"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.IBPluginDependency</string>
+ <string>-2.IBPluginDependency</string>
+ <string>-3.IBPluginDependency</string>
+ <string>11.IBPluginDependency</string>
+ <string>12.IBPluginDependency</string>
+ <string>13.IBPluginDependency</string>
+ <string>14.IBPluginDependency</string>
+ <string>15.IBPluginDependency</string>
+ <string>16.IBPluginDependency</string>
+ <string>17.IBPluginDependency</string>
+ <string>18.IBPluginDependency</string>
+ <string>5.IBPluginDependency</string>
+ <string>5.ImportedFromIB2</string>
+ <string>8.IBEditorWindowLastContentRect</string>
+ <string>8.IBPluginDependency</string>
+ <string>8.ImportedFromIB2</string>
+ <string>8.editorWindowContentRectSynchronizationRect</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" id="5"/>
+ <string>{{336, 964}, {418, 330}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>{{467, 510}, {418, 330}}</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">24</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">O3D_StatsPane</string>
+ <string key="superclassName">InstallerPane</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>statsOffRadio_</string>
+ <string>statsOnRadio_</string>
+ <string>statsRadioMatrix_</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSButtonCell</string>
+ <string>NSButtonCell</string>
+ <string>NSMatrix</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">O3D_StatsPane.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../O3D_Stats.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/o3d/installer/mac/O3D_Stats/Info.plist b/o3d/installer/mac/O3D_Stats/Info.plist
new file mode 100644
index 0000000..181fd45
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/Info.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.google.${PRODUCT_NAME:identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>4.0</string>
+ <key>CFBundleSignature</key>
+ <string>O3Di</string>
+ <key>CFBundleVersion</key>
+ <string>2.0</string>
+ <key>InstallerSectionTitle</key>
+ <string>Statistics</string>
+ <key>NSMainNibFile</key>
+ <string>O3D_Stats</string>
+ <key>NSPrincipalClass</key>
+ <string>InstallerSection</string>
+</dict>
+</plist>
diff --git a/o3d/installer/mac/O3D_Stats/InstallerSections.plist b/o3d/installer/mac/O3D_Stats/InstallerSections.plist
new file mode 100644
index 0000000..0c840f8
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/InstallerSections.plist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SectionOrder</key>
+ <array>
+ <string>Introduction</string>
+ <string>ReadMe</string>
+ <string>License</string>
+ <string>O3D_Stats.bundle</string>
+ <string>Target</string>
+ <string>PackageSelection</string>
+ <string>Install</string>
+ </array>
+</dict>
+</plist>
diff --git a/o3d/installer/mac/O3D_Stats/O3D_Stats.xcodeproj/project.pbxproj b/o3d/installer/mac/O3D_Stats/O3D_Stats.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..961c1c7
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/O3D_Stats.xcodeproj/project.pbxproj
@@ -0,0 +1,291 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
+ 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
+ B40F7FFC06739E1B0053A16B /* InstallerPlugins.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B40F7FFB06739E1B0053A16B /* InstallerPlugins.framework */; };
+ B44C200B06739AE500D31AA1 /* O3D_StatsPane.m in Sources */ = {isa = PBXBuildFile; fileRef = B44C200906739AE500D31AA1 /* O3D_StatsPane.m */; };
+ B47CF355067B4E030066DBF6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B47CF353067B4E030066DBF6 /* Localizable.strings */; };
+ EE3F05FC0DD294BA00EA504A /* O3D_Stats.xib in Resources */ = {isa = PBXBuildFile; fileRef = EE3F05FA0DD294BA00EA504A /* O3D_Stats.xib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 32DBCF630370AF2F00C91783 /* O3D_Stats_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = O3D_Stats_Prefix.pch; sourceTree = "<group>"; };
+ 8D5B49B6048680CD000E48DA /* O3D_Stats.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = O3D_Stats.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ B40F7FFB06739E1B0053A16B /* InstallerPlugins.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = InstallerPlugins.framework; path = /System/Library/Frameworks/InstallerPlugins.framework; sourceTree = "<absolute>"; };
+ B44C200806739AE500D31AA1 /* O3D_StatsPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = O3D_StatsPane.h; sourceTree = "<group>"; };
+ B44C200906739AE500D31AA1 /* O3D_StatsPane.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = O3D_StatsPane.m; sourceTree = "<group>"; };
+ B47CF354067B4E030066DBF6 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
+ B4A6B2A60673D523003CD9B2 /* InstallerSections.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = "<group>"; };
+ EE3F05FB0DD294BA00EA504A /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/O3D_Stats.xib; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D5B49B3048680CD000E48DA /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */,
+ B40F7FFC06739E1B0053A16B /* InstallerPlugins.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* InstallerPlugin */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB77AFFE84173DC02AAC07 /* Classes */,
+ 32C88E010371C26100C91783 /* Other Sources */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */,
+ 19C28FB8FE9D52D311CA2CBB /* Products */,
+ );
+ name = InstallerPlugin;
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */,
+ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */,
+ );
+ name = "Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ EE3F05FA0DD294BA00EA504A /* O3D_Stats.xib */,
+ B47CF353067B4E030066DBF6 /* Localizable.strings */,
+ B4A6B2A60673D523003CD9B2 /* InstallerSections.plist */,
+ 8D5B49B7048680CD000E48DA /* Info.plist */,
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 08FB77AFFE84173DC02AAC07 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ B44C200906739AE500D31AA1 /* O3D_StatsPane.m */,
+ B44C200806739AE500D31AA1 /* O3D_StatsPane.h */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */,
+ B40F7FFB06739E1B0053A16B /* InstallerPlugins.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "<group>";
+ };
+ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 089C1672FE841209C02AAC07 /* Foundation.framework */,
+ 089C167FFE841241C02AAC07 /* AppKit.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ 19C28FB8FE9D52D311CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D5B49B6048680CD000E48DA /* O3D_Stats.bundle */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 32C88E010371C26100C91783 /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32DBCF630370AF2F00C91783 /* O3D_Stats_Prefix.pch */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8D5B49AC048680CD000E48DA /* O3D_Stats */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = B44174E608BA33C40065BEDE /* Build configuration list for PBXNativeTarget "O3D_Stats" */;
+ buildPhases = (
+ 8D5B49AF048680CD000E48DA /* Resources */,
+ 8D5B49B1048680CD000E48DA /* Sources */,
+ 8D5B49B3048680CD000E48DA /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = O3D_Stats;
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = InstallerPlugin;
+ productReference = 8D5B49B6048680CD000E48DA /* O3D_Stats.bundle */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = B44174EA08BA33C40065BEDE /* Build configuration list for PBXProject "O3D_Stats" */;
+ compatibilityVersion = "Xcode 3.1";
+ hasScannedForEncodings = 1;
+ mainGroup = 089C166AFE841209C02AAC07 /* InstallerPlugin */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8D5B49AC048680CD000E48DA /* O3D_Stats */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D5B49AF048680CD000E48DA /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */,
+ B47CF355067B4E030066DBF6 /* Localizable.strings in Resources */,
+ EE3F05FC0DD294BA00EA504A /* O3D_Stats.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D5B49B1048680CD000E48DA /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ B44C200B06739AE500D31AA1 /* O3D_StatsPane.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ B47CF353067B4E030066DBF6 /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ B47CF354067B4E030066DBF6 /* English */,
+ );
+ name = Localizable.strings;
+ sourceTree = "<group>";
+ };
+ EE3F05FA0DD294BA00EA504A /* O3D_Stats.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ EE3F05FB0DD294BA00EA504A /* English */,
+ );
+ name = O3D_Stats.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ B44174E708BA33C40065BEDE /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = O3D_Stats_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Bundles";
+ PRODUCT_NAME = O3D_Stats;
+ WRAPPER_EXTENSION = bundle;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ B44174E808BA33C40065BEDE /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = O3D_Stats_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Bundles";
+ PRODUCT_NAME = O3D_Stats;
+ WRAPPER_EXTENSION = bundle;
+ };
+ name = Release;
+ };
+ B44174EB08BA33C40065BEDE /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = i386;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx10.4;
+ };
+ name = Debug;
+ };
+ B44174EC08BA33C40065BEDE /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = i386;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx10.4;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ B44174E608BA33C40065BEDE /* Build configuration list for PBXNativeTarget "O3D_Stats" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ B44174E708BA33C40065BEDE /* Debug */,
+ B44174E808BA33C40065BEDE /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ B44174EA08BA33C40065BEDE /* Build configuration list for PBXProject "O3D_Stats" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ B44174EB08BA33C40065BEDE /* Debug */,
+ B44174EC08BA33C40065BEDE /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
diff --git a/o3d/installer/mac/O3D_Stats/O3D_StatsPane.h b/o3d/installer/mac/O3D_Stats/O3D_StatsPane.h
new file mode 100644
index 0000000..6889341
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/O3D_StatsPane.h
@@ -0,0 +1,54 @@
+//
+// O3D_StatsPane.h
+// O3D_Stats
+//
+
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+#import <Cocoa/Cocoa.h>
+#import <InstallerPlugins/InstallerPlugins.h>
+
+@interface O3D_StatsPane : InstallerPane {
+ IBOutlet NSButtonCell *statsOnRadio_;
+ IBOutlet NSButtonCell *statsOffRadio_;
+ IBOutlet NSMatrix *statsRadioMatrix_;
+}
+
+
+- (BOOL)shouldExitPane:(InstallerSectionDirection)dir;
+
+- (void)didEnterPane:(InstallerSectionDirection)dir;
+
+
+@end
diff --git a/o3d/installer/mac/O3D_Stats/O3D_StatsPane.m b/o3d/installer/mac/O3D_Stats/O3D_StatsPane.m
new file mode 100644
index 0000000..4d3ae0d
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/O3D_StatsPane.m
@@ -0,0 +1,67 @@
+//
+// O3D_StatsPane.m
+// O3D_Stats
+//
+
+// @@REWRITE(insert c-copyright)
+// @@REWRITE(delete-start)
+// Created by Matthew Vosburgh on 4/14/09.
+// Copyright (c) 2009 Google Inc. All rights reserved.
+// @@REWRITE(delete-end)
+
+#import "O3D_StatsPane.h"
+
+#define kPrefString @"O3D_STATS"
+
+
+@implementation O3D_StatsPane
+
+// Read a pref string for current user, but global to all apps.
+static NSString* ReadGlobalPreferenceString(NSString *key) {
+ return (NSString *)CFPreferencesCopyValue((CFStringRef)key,
+ kCFPreferencesAnyApplication,
+ kCFPreferencesCurrentUser,
+ kCFPreferencesCurrentHost);
+}
+
+
+// Write a pref string for the current user, but global to all apps.
+static void WriteGlobalPreferenceString(NSString *key,
+ NSString *value) {
+ CFPreferencesSetValue((CFStringRef)key,
+ (CFPropertyListRef)value,
+ kCFPreferencesAnyApplication,
+ kCFPreferencesCurrentUser,
+ kCFPreferencesCurrentHost);
+
+ CFPreferencesSynchronize(kCFPreferencesAnyApplication,
+ kCFPreferencesCurrentUser,
+ kCFPreferencesCurrentHost);
+}
+
+
+- (NSString *)title {
+ NSBundle *bundle = [NSBundle bundleForClass:[self class]];
+
+ return [bundle localizedStringForKey:@"PaneTitle"
+ value:nil
+ table:nil];
+}
+
+
+- (BOOL)shouldExitPane:(InstallerSectionDirection)dir {
+ BOOL statsOn = [statsRadioMatrix_ selectedCell] == statsOnRadio_;
+
+ WriteGlobalPreferenceString(kPrefString, statsOn ? @"YES" : @"NO");
+ return YES;
+}
+
+- (void)didEnterPane:(InstallerSectionDirection)dir {
+ NSString *value = ReadGlobalPreferenceString(kPrefString);
+ BOOL statsOn = ![value isEqualToString:@"NO"];
+
+ [statsRadioMatrix_ selectCell: statsOn ? statsOnRadio_ : statsOffRadio_];
+}
+
+
+@end
diff --git a/o3d/installer/mac/O3D_Stats/O3D_Stats_Prefix.pch b/o3d/installer/mac/O3D_Stats/O3D_Stats_Prefix.pch
new file mode 100644
index 0000000..b3c37ff
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/O3D_Stats_Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'InstallerPlugin' target in the 'InstallerPlugin' project.
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
diff --git a/o3d/installer/mac/O3D_Stats/version.plist b/o3d/installer/mac/O3D_Stats/version.plist
new file mode 100644
index 0000000..a548b4b
--- /dev/null
+++ b/o3d/installer/mac/O3D_Stats/version.plist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildVersion</key>
+ <string>32</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>ProjectName</key>
+ <string>DevToolsWizardTemplates</string>
+ <key>SourceVersion</key>
+ <string>3670000</string>
+</dict>
+</plist>
diff --git a/o3d/installer/win/build.scons b/o3d/installer/win/build.scons
new file mode 100644
index 0000000..a9979ef
--- /dev/null
+++ b/o3d/installer/win/build.scons
@@ -0,0 +1,207 @@
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+import os
+Import('env')
+
+INPUTS = [
+ 'custom_actions.cc',
+]
+
+CUSTOM_ACTIONS_LIBS = [
+ 'advapi32',
+ 'dxguid',
+ 'msi',
+ 'ole32',
+ 'oleaut32',
+ 'shell32',
+ 'shlwapi',
+ 'user32',
+]
+
+# Build the dll, provide our own set of libraries to be linked with our dll.
+# It is important to have full control of this since custom actions will run
+# in a 'sandbox' and can't have external dependencies.
+cactions = env.ComponentLibrary('cactions', INPUTS, LIBS=CUSTOM_ACTIONS_LIBS,
+ COMPONENT_STATIC=False)
+
+# copy to artifacts
+env.Replicate('$ARTIFACTS_DIR', cactions[0])
+
+# Unique guid for o3d namespace generated by www.guidgen.com
+o3d_namespace_guid = 'B445DBAE-F5F9-435A-9A9B-088261CDF00A'
+
+# Pull out version numbers.
+nppversion = env.get('O3D_PLUGIN_VERSION_COMMAS')
+dotnppversion = env.get('O3D_PLUGIN_VERSION')
+# We don't actually want the extras version to update by itself; it should
+# change only when we actually add something to the installer or change the
+# d3dx9 version. This version is therefore independent of the o3d plugin and
+# sdk versions.
+extrasversion ='0,1,1,0'
+dotextrasversion = '0.1.1.0'
+
+# TODO: this should be a tool!!
+
+# Utility function for generating GUID's in the o3d namespace.
+def gen_named_guid(namespace_guid, name, version):
+ nbguidgen_exe = env.File('$SCONSTRUCT_DIR/nbguidgen/win/nbguidgen.exe')
+ guid = os.popen('%s %s %s' %
+ (nbguidgen_exe.abspath, namespace_guid,
+ '%s-%s' % (name, version))).read()
+ return guid
+
+def get_guid_generator(namespace_guid, version):
+ return lambda name: gen_named_guid(namespace_guid, name, version)
+
+# TODO: These all return the same generator if their versions match.
+# Is that a problem? Do we really need more than one of them?
+plugin_guid_generator = \
+ get_guid_generator(o3d_namespace_guid, nppversion)
+extras_guid_generator = \
+ get_guid_generator(o3d_namespace_guid, extrasversion)
+
+google_update_reg_path = 'Software\\Google\\Update\\Clients\\'
+google_update_state_reg_path = 'Software\\Google\\Update\\ClientState\\'
+
+# Guids and other variables for the plugin installer:
+o3d_npp_product_guid = plugin_guid_generator('o3d_product')
+o3d_npp_package_guid = plugin_guid_generator('o3d_package')
+dx_redist_guid = plugin_guid_generator('dx_redist')
+d3dx_guid = plugin_guid_generator('d3dx')
+
+# Changing the following values would break upgrade paths, so we hard-code the
+# values instead of generating them. The commands used to generate them are
+# kept, so that we can avoid creating collisions accidentally.
+
+# bad_old_o3d_upgrade_code = gen_named_guid(o3d_namespace_guid,
+# 'magicflute_upgrade', '')
+# o3d_npp_upgrade_code = gen_named_guid(o3d_namespace_guid,
+# 'plugin_upgrade', '')
+# o3d_extras_upgrade_code = gen_named_guid(o3d_namespace_guid,
+# 'extras_upgrade', '')
+bad_old_o3d_upgrade_code = 'dc819ed6-4155-3cff-b580-45626aed5848'
+o3d_npp_upgrade_code = '0f098121-2876-3c23-bd4c-501220ecbb42'
+o3d_extras_upgrade_code = 'c271f2f0-c7ad-3bc9-8216-211436aa2244'
+
+# Keep these around for historical reasons; if we ever want to bring the SDK
+# back, we might want to use the same GUIDs and Google Update project for
+# simplicity.
+#o3d_sdk_upgrade_code = 'd6b024ab-1784-348b-80c5-96ab43799d0a'
+#o3d_sdk_google_update_guid = '{00764f6f-9998-4520-9c41-94a30e36565a}'
+
+o3d_npp_component_guid = plugin_guid_generator(
+ 'o3d_npplugin_component')
+o3d_iep_component_guid = plugin_guid_generator(
+ 'o3d_ieplugin_component')
+o3d_npp_google_update_reg_component_guid = plugin_guid_generator(
+ 'o3d_user_google_update_reg_component')
+o3d_reporter_guid = plugin_guid_generator('o3d_reporter')
+o3d_driver_blacklist_guid = plugin_guid_generator(
+ 'o3d_driver_blacklist')
+o3d_npp_google_update_guid = '{70308795-045C-42da-8F4E-D452381A7459}'
+o3d_npp_reg_key = '%s%s' % (google_update_reg_path, o3d_npp_google_update_guid)
+o3d_npp_state_reg_key = '%s%s' % (
+ google_update_state_reg_path, o3d_npp_google_update_guid)
+
+# Guids and other variables for the extras installer:
+o3d_extras_d3dx_component_guid = plugin_guid_generator(
+ 'o3d_extras_d3dx_component')
+o3d_extras_product_guid = extras_guid_generator('o3d_extras_product')
+o3d_extras_package_guid = extras_guid_generator('o3d_extras_package')
+o3d_get_extras_guid = gen_named_guid(o3d_namespace_guid,
+ 'extras_installer', '')
+
+o3d_extras_google_update_guid = '{34B2805D-C72C-4f81-AED5-5A22D1E092F1}'
+o3d_extras_reg_key = '%s%s' % (google_update_reg_path, o3d_extras_google_update_guid)
+
+# Wix tool needs to be in the PATH.
+# TODO: the wix tool should not need this dance!
+wix_path = env.Dir('$WIX_DIR')
+path = os.environ['PATH']
+path += os.pathsep + wix_path.abspath
+os.environ['PATH'] = path
+
+# Add the wix tool to the SCons environment.
+env.Tool('wix')
+
+# Lookup the plugin to be installed
+npplugin_path = env.File('$ARTIFACTS_DIR/npo3dautoplugin.dll')
+ieplugin_path = env.File('$ARTIFACTS_DIR/o3d_host.dll')
+conditioner_path = env.File('$ARTIFACTS_DIR/o3dConditioner.exe')
+cglib1_path = env.File('$ARTIFACTS_DIR/cg.dll')
+cglib2_path = env.File('$ARTIFACTS_DIR/cgGL.dll')
+cgc_path = env.File('$ARTIFACTS_DIR/cgc.exe')
+docs_path = env.File('$SCONSTRUCT_DIR/installer/win/docs.url')
+rep_path = env.File('$ARTIFACTS_DIR/reporter.exe')
+dbl_path = env.File('$SCONSTRUCT_DIR/installer/win/driver_blacklist.txt')
+get_extras_path = env.File('$ARTIFACTS_DIR/getextras.exe')
+
+
+# Path to custiom actions dll.
+cactions_dll_path = env.File('$ARTIFACTS_DIR/cactions.dll')
+
+# Pass flags to the wix compiler.
+env.Append(WIXCANDLEFLAGS = [
+ '-dNppProductGuid=' + o3d_npp_product_guid,
+ '-dNppVersion=' + dotnppversion,
+ '-dDeprecatedUpgradeCode=' + bad_old_o3d_upgrade_code,
+ '-dNppUpgradeCode=' + o3d_npp_upgrade_code,
+ '-dNppPackageGuid=' + o3d_npp_package_guid,
+ '-dNppComponentGuid=' + o3d_npp_component_guid,
+ '-dNPPluginPath=' + npplugin_path.abspath,
+ '-dIEPluginPath=' + ieplugin_path.abspath,
+ '-dIepComponentGuid=' + o3d_iep_component_guid,
+ '-dD3DXGuid=' + d3dx_guid,
+ '-dNppGoogleUpdateRegGuid=' + o3d_npp_google_update_reg_component_guid,
+ '-dNppGoogleUpdateRegKey=' + o3d_npp_reg_key,
+ '-dNppGoogleUpdateStateRegKey=' + o3d_npp_state_reg_key,
+ '-dRepGuid=' + o3d_reporter_guid,
+ '-dDBLGuid=' + o3d_driver_blacklist_guid,
+ '-dRepPath=' + rep_path.abspath,
+ '-dDBLPath=' + dbl_path.abspath,
+ '-dGetExtrasGuid=' + o3d_get_extras_guid,
+ '-dGetExtrasPath=' + get_extras_path.abspath,
+])
+
+# Build installer
+installer_msi = env.WiX('o3d.msi', ['o3d_plugin.wxs'])
+
+# Make sure that the plugin dll has been built before building the installer.
+# Make sure that the custom action dll has been built before building the
+# installer.
+# Relies on reporter.exe being built prior to installer.
+env.Depends(installer_msi,
+ [npplugin_path, ieplugin_path, cactions_dll_path, rep_path,
+ get_extras_path])
+
+# Copy to artifacts.
+env.Replicate('$ARTIFACTS_DIR', installer_msi)
+
diff --git a/o3d/installer/win/custom_actions.cc b/o3d/installer/win/custom_actions.cc
new file mode 100644
index 0000000..658d5b7
--- /dev/null
+++ b/o3d/installer/win/custom_actions.cc
@@ -0,0 +1,326 @@
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Custom installer action which checks if DirectX 9.0c or later is present.
+
+#include <dxdiag.h>
+#include <msi.h>
+#include <msiquery.h>
+#include <shellapi.h>
+#include <shlwapi.h>
+#include <tchar.h>
+#include <strsafe.h> // Must be after tchar.h.
+#include <windows.h>
+#include <atlstr.h>
+
+#include "plugin/win/update_lock.h"
+
+#pragma comment(linker, "/EXPORT:CheckDirectX=_CheckDirectX@4")
+#pragma comment(linker, "/EXPORT:IsSoftwareRunning=_IsSoftwareRunning@4")
+#pragma comment(linker, "/EXPORT:InstallD3DXIfNeeded=_InstallD3DXIfNeeded@4")
+
+#if 0
+// NOTE: Useful for debugging, but not currently in use. Left here so
+// that I don't have to figure out how to write it again.
+void PopupMsiError(MSIHANDLE installer_handle, int id) {
+ PMSIHANDLE record_handle = MsiCreateRecord(1);
+ MsiRecordSetInteger(record_handle, 1, id);
+ MsiProcessMessage(installer_handle, INSTALLMESSAGE(INSTALLMESSAGE_USER|MB_OK),
+ record_handle);
+ MsiCloseHandle(record_handle);
+}
+#endif
+
+void WriteToMsiLog(MSIHANDLE installer_handle, TCHAR *message) {
+ PMSIHANDLE record_handle = MsiCreateRecord(1);
+ MsiRecordSetString(record_handle, 1, message);
+ MsiProcessMessage(installer_handle, INSTALLMESSAGE_INFO, record_handle);
+ MsiCloseHandle(record_handle);
+}
+
+HRESULT SetRegKeyValueString(HKEY hkey_parent, const TCHAR *key_name,
+ const TCHAR *value_name, const TCHAR *value, DWORD value_size) {
+ HKEY hkey;
+ LONG res = ::RegCreateKeyEx(hkey_parent, key_name, 0, 0,
+ REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hkey, NULL);
+ HRESULT hr = HRESULT_FROM_WIN32(res);
+
+ if (hr != S_OK) {
+ return hr;
+ }
+
+ res = ::RegSetValueEx(hkey, value_name, 0, REG_SZ,
+ reinterpret_cast<const BYTE *>(value), value_size);
+ hr = HRESULT_FROM_WIN32(res);
+
+ ::RegCloseKey(hkey);
+ return hr;
+}
+
+HRESULT SetRegKeyValueDWord(HKEY hkey_parent, const TCHAR *key_name,
+ const TCHAR *value_name, DWORD value) {
+ HKEY hkey;
+ LONG res = ::RegCreateKeyEx(hkey_parent, key_name, 0, 0,
+ REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hkey, NULL);
+ HRESULT hr = HRESULT_FROM_WIN32(res);
+
+ if (hr != S_OK) {
+ return hr;
+ }
+
+ res = ::RegSetValueEx(hkey, value_name, 0, REG_DWORD,
+ reinterpret_cast<const BYTE *>(&value), sizeof(value));
+ hr = HRESULT_FROM_WIN32(res);
+
+ ::RegCloseKey(hkey);
+ return hr;
+}
+
+// Retrieve the currently installed version of DirectX using a COM
+// DxDiagProvider. Returns 0 on error.
+DWORD GetDirectXVersion() {
+ HRESULT hr;
+ DWORD directx_version = 0;
+ DWORD directx_version_major = 0;
+ DWORD directx_version_minor = 0;
+ TCHAR directx_version_letter = ' ';
+
+ bool cleanup_com = false;
+
+ bool success_getting_major = false;
+ bool success_getting_minor = false;
+ bool success_getting_letter = false;
+
+ // Init COM. COM may fail if its already been inited with a different
+ // concurrency model. And if it fails you shouldn't release it.
+ hr = CoInitialize(NULL);
+ cleanup_com = SUCCEEDED(hr);
+
+ // Get an IDxDiagProvider
+ IDxDiagProvider* dx_diag_provider = NULL;
+ hr = CoCreateInstance(CLSID_DxDiagProvider,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_IDxDiagProvider,
+ reinterpret_cast<LPVOID*>(&dx_diag_provider));
+ if (SUCCEEDED(hr)) {
+ // Fill out a DXDIAG_INIT_PARAMS struct
+ DXDIAG_INIT_PARAMS dx_diag_init_param;
+ ZeroMemory(&dx_diag_init_param, sizeof(DXDIAG_INIT_PARAMS));
+ dx_diag_init_param.dwSize = sizeof(DXDIAG_INIT_PARAMS);
+ dx_diag_init_param.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
+ dx_diag_init_param.bAllowWHQLChecks = false;
+ dx_diag_init_param.pReserved = NULL;
+
+ // Init the DxDiagProvider
+ hr = dx_diag_provider->Initialize(&dx_diag_init_param);
+ if (SUCCEEDED(hr)) {
+ IDxDiagContainer* dx_diag_root = NULL;
+ IDxDiagContainer* dx_diag_system_info = NULL;
+
+ // Get the DxDiag root container
+ hr = dx_diag_provider->GetRootContainer(&dx_diag_root);
+ if (SUCCEEDED(hr)) {
+ // Get the object called DxDiag_SystemInfo
+ hr = dx_diag_root->GetChildContainer(L"DxDiag_SystemInfo",
+ &dx_diag_system_info);
+ if (SUCCEEDED(hr)) {
+ VARIANT var;
+ VariantInit(&var);
+
+ // Get the "dwDirectXVersionMajor" property
+ hr = dx_diag_system_info->GetProp(L"dwDirectXVersionMajor", &var);
+ if (SUCCEEDED(hr) && var.vt == VT_UI4) {
+ directx_version_major = var.ulVal;
+ success_getting_major = true;
+ }
+ VariantClear(&var);
+
+ // Get the "dwDirectXVersionMinor" property
+ hr = dx_diag_system_info->GetProp(L"dwDirectXVersionMinor", &var);
+ if (SUCCEEDED(hr) && var.vt == VT_UI4) {
+ directx_version_minor = var.ulVal;
+ success_getting_minor = true;
+ }
+ VariantClear(&var);
+
+ // Get the "szDirectXVersionLetter" property
+ hr = dx_diag_system_info->GetProp(L"szDirectXVersionLetter", &var);
+ if (SUCCEEDED(hr) && var.vt == VT_BSTR &&
+ SysStringLen(var.bstrVal) != 0) {
+#ifdef UNICODE
+ directx_version_letter = var.bstrVal[0];
+#else
+ char strDestination[10];
+ WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, strDestination,
+ 10 * sizeof(CHAR), NULL, NULL);
+ directx_version_letter =
+ static_cast<char>(tolower(strDestination[0]));
+#endif
+ success_getting_letter = true;
+ }
+ VariantClear(&var);
+
+ // If it all worked right, then mark it down
+ if (success_getting_major && success_getting_minor &&
+ success_getting_letter) {
+ // Convert to hex representation.
+ directx_version = directx_version_major;
+ directx_version <<= 8;
+ directx_version += directx_version_minor;
+ directx_version <<= 8;
+ if (directx_version_letter >= 'a' &&
+ directx_version_letter <= 'z') {
+ directx_version += (directx_version_letter - 'a') + 1;
+ }
+ }
+ dx_diag_system_info->Release();
+ }
+ dx_diag_root->Release();
+ }
+ }
+ dx_diag_provider->Release();
+ }
+
+ if (cleanup_com) {
+ CoUninitialize();
+ }
+ return directx_version;
+}
+
+HRESULT SetCustomUpdateError(MSIHANDLE installer_handle,
+ DWORD error_code,
+ CString message) {
+ wchar_t key_name[256];
+ DWORD key_size = 256;
+ UINT ret = MsiGetProperty(installer_handle, L"GoogleUpdateResultKey",
+ reinterpret_cast<LPWSTR>(&key_name), &key_size);
+ if (ret != ERROR_SUCCESS) {
+ WriteToMsiLog(installer_handle, _T("MsiGetProperty failed!"));
+ return ERROR_READ_FAULT;
+ } else {
+ HRESULT hr = SetRegKeyValueDWord(HKEY_CURRENT_USER, key_name,
+ _T("InstallerResult"), 1 /* FAILED_CUSTOM_ERROR */);
+ if (hr != S_OK) {
+ WriteToMsiLog(installer_handle, _T("SetRegKeyValueDWord failed!"));
+ return hr;
+ }
+ hr = SetRegKeyValueDWord(HKEY_CURRENT_USER, key_name,
+ _T("InstallerError"), error_code);
+ if (hr != S_OK) {
+ WriteToMsiLog(installer_handle, _T("SetRegKeyValueDWord failed!"));
+ return hr;
+ }
+ hr = SetRegKeyValueString(HKEY_CURRENT_USER, key_name,
+ _T("InstallerResultUIString"),
+ message, message.GetLength() * sizeof(TCHAR));
+ if (hr != S_OK) {
+ WriteToMsiLog(installer_handle, _T("SetRegKeyValueString failed!"));
+ return hr;
+ }
+ }
+}
+
+// Check whether DirectX version 9.0c or higher is installed and
+// notify the installer about the result.
+extern "C" UINT __stdcall CheckDirectX(MSIHANDLE installer_handle) {
+ // Get current version.
+ DWORD installed_version = GetDirectXVersion();
+
+ // 0x090003 == 9.0c
+ if (installed_version >= 0x090003) {
+ // Set msi property to let the installer know that the currently
+ // installed version of dx is new enough.
+ UINT ret = MsiSetProperty(installer_handle, L"DIRECTX_9_0_C_INSTALLED",
+ L"1");
+ } else {
+ // TODO: This will need i18n when we do that for the rest of o3d.
+ CString message =
+ _T("O3D needs an installation of DirectX 9.0 revision C or later.\n")
+ _T("\nPlease download the latest version of DirectX from ")
+ _T("http://www.microsoft.com/download.");
+ DWORD error_code = 1603; /* Fatal error during installation */
+ if (SetCustomUpdateError(installer_handle, error_code, message) != S_OK) {
+ return ERROR_WRITE_FAULT;
+ }
+ }
+ return ERROR_SUCCESS;
+}
+
+// Check to see whether the plugin is currently running. If it is, we can't
+// update the plugin. The installer will check for the SOFTWARE_RUNNING flag
+// and exit if it's trying to do a silent update. Knowing that it's failed this
+// time, it'll try again later.
+extern "C" UINT __stdcall IsSoftwareRunning(MSIHANDLE installer_handle) {
+ if (!update_lock::CanUpdate()) {
+ MsiSetProperty(installer_handle, L"SOFTWARE_RUNNING", L"1");
+ }
+
+ return ERROR_SUCCESS;
+}
+
+// TODO: Get security to review this method in particular, as it runs an
+// executable in a predictable location.
+extern "C" UINT __stdcall InstallD3DXIfNeeded(MSIHANDLE installer_handle) {
+ HANDLE handle = ::LoadLibrary(L"d3dx9_36.dll");
+ if (handle) {
+ ::CloseHandle(handle);
+ } else {
+ // 2 output characters per byte in the input due to hex format, then one
+ // extra for the NUL.
+ TCHAR idString[sizeof(DWORD) * 2 + 1];
+ HRESULT hr = ::StringCchPrintf(idString, sizeof(idString) / sizeof(TCHAR),
+ _T("%x"), ::GetCurrentProcessId());
+ if (!SUCCEEDED(hr)) {
+ WriteToMsiLog(installer_handle, _T("StringCchPrintf failed!"));
+ return ERROR_GEN_FAILURE;
+ }
+ TCHAR getextras_path[] = _T("%TEMP%\\Extras\\getextras.exe");
+ SHELLEXECUTEINFO info = {0};
+ info.cbSize = sizeof(info);
+ info.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI | SEE_MASK_UNICODE;
+ info.lpVerb = _T("open");
+ info.lpFile = getextras_path;
+ info.lpParameters = idString;
+ // SW_HIDE is a wild guess, but seems as good as any.
+ info.nShow = SW_HIDE;
+ info.lpDirectory = NULL;
+ if (!::ShellExecuteEx(&info)) {
+ WriteToMsiLog(installer_handle,
+ _T("ShellExecuteEx of getextras.exe failed."));
+ WriteToMsiLog(installer_handle,
+ _T("Path was:"));
+ WriteToMsiLog(installer_handle, getextras_path);
+ return ERROR_GEN_FAILURE;
+ }
+ }
+ return ERROR_SUCCESS;
+}
diff --git a/o3d/installer/win/docs.url b/o3d/installer/win/docs.url
new file mode 100644
index 0000000..54d3edc
--- /dev/null
+++ b/o3d/installer/win/docs.url
@@ -0,0 +1,4 @@
+[InternetShortcut]
+URL=http://go.corp.google.com/o3d
+IconFile=http://www.google.com/favicon.ico
+IconIndex=1
diff --git a/o3d/installer/win/driver_blacklist.txt b/o3d/installer/win/driver_blacklist.txt
new file mode 100644
index 0000000..1b45e75
--- /dev/null
+++ b/o3d/installer/win/driver_blacklist.txt
@@ -0,0 +1,12 @@
+# This file contains the GUIDs of blacklisted drivers as unsigned ints in hex.
+# File format:
+# # comments out to the end of a line.
+# Lines should be no longer than 256 characters. Still, to keep things
+# simple, just put one GUID per line.
+# Whitespace is ignored except in that it separates GUIDs.
+# No other characters are legal.
+
+# Sample GUID [DO NOT UNCOMMENT THIS LINE]:
+# 0xd7b71e3e
+
+# Actual blacklisted drivers:
diff --git a/o3d/installer/win/o3d_extras.wxs b/o3d/installer/win/o3d_extras.wxs
new file mode 100644
index 0000000..9568236
--- /dev/null
+++ b/o3d/installer/win/o3d_extras.wxs
@@ -0,0 +1,120 @@
+<?xml version='1.0' encoding='windows-1252'?>
+
+<!--
+Copyright 2009, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<!--
+ Wix script for the installer that puts the d3dx9 dll where o3d can find
+ it.
+-->
+
+<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>
+
+ <Product Name='O3D Extras' Id='$(var.ExtrasProductGuid)'
+ Language='1033' Codepage='1252' Version='$(var.ExtrasVersion)'
+ Manufacturer='Google' UpgradeCode='$(var.ExtrasUpgradeCode)'>
+ <Package Id='$(var.ExtrasPackageGuid)' Keywords='Installer'
+ Description='O3D Extras Installer' Manufacturer='Google'
+ InstallerVersion='101' InstallPrivileges='limited'
+ Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+
+ <Media Id='1' Cabinet='o3dExtras.cab' EmbedCab='yes'
+ CompressionLevel='high'/>
+
+ <Directory Id='TARGETDIR' Name='SourceDir'>
+ <Directory Id='AppDataFolder' Name='QFiles'>
+ <Directory Id='pu.MozillaDir' Name='Mozilla'>
+ <Directory Id='pu.FirefoxPluginsDir' Name='plugins'>
+ <Directory Id='O3DPrivateDllDir' Name='O3D'
+ LongName='O3DExtras'>
+ <Component Id='D3DXRedist' Guid='$(var.ExtrasD3DXComponentGuid)'>
+ <File Id='d3dx' Name="d3dx9_36.dll" Vital='yes'
+ DiskId='1' src='$(var.DxRedistPath)\d3dx9_36.dll' />
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ <!-- Write the current version of the plugin to the Google Update
+ registry key for auto update. -->
+ <Component Id='pu.UpdateReg' Guid='$(var.ExtrasGoogleUpdateRegGuid)'>
+ <Registry Id='pu.UpdateRegistryKeys' Root='HKCU'
+ Key='$(var.ExtrasGoogleUpdateRegKey)'
+ Name='pv' Value='$(var.ExtrasVersion)' Action='write'
+ Type='string' />
+ <Registry Id='pu.UpdateRegistryKeys2' Root='HKCU'
+ Key='$(var.ExtrasGoogleUpdateRegKey)'
+ Name='name' Value='o3d_extras' Action='write'
+ Type='string' />
+ <Registry Id='pu.UpdateRegistryKeys3' Root='HKCU'
+ Key='$(var.ExtrasGoogleUpdateRegKey)'
+ Name='lang' Value='en' Action='write'
+ Type='string' />
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+
+ <Feature
+ Id='UpdateRegistry'
+ Level='1'>
+ <ComponentRef
+ Id='pu.UpdateReg'/>
+ </Feature>
+ <Feature
+ Id='DirectX'
+ Level='1'>
+ <ComponentRef
+ Id='D3DXRedist'/>
+ </Feature>
+
+ <Upgrade Id='$(var.ExtrasUpgradeCode)'>
+ <UpgradeVersion
+ Minimum='0.0.0.0' IncludeMinimum='yes'
+ Maximum='$(var.ExtrasVersion)' IncludeMaximum='yes'
+ OnlyDetect='no' Property='UPGRADING'/>
+ </Upgrade>
+
+ <InstallExecuteSequence>
+ <UnregisterClassInfo>
+ (REMOVE="ALL") OR UPGRADING
+ </UnregisterClassInfo>
+ <RemoveExistingProducts After='InstallInitialize'>
+ UPGRADING
+ </RemoveExistingProducts>
+ <RegisterClassInfo/>
+ </InstallExecuteSequence>
+
+ <InstallUISequence>
+ </InstallUISequence>
+
+ </Product>
+</Wix>
diff --git a/o3d/installer/win/o3d_kill_version.py b/o3d/installer/win/o3d_kill_version.py
new file mode 100644
index 0000000..e3eb624
--- /dev/null
+++ b/o3d/installer/win/o3d_kill_version.py
@@ -0,0 +1,6 @@
+#!/usr/bin/python2.4
+# Copyright 2008 Google Inc. All Rights Reserved.
+
+# version = (major, minor, trunk, patch)
+plugin_version = (0, 2, 0, 0)
+sdk_version = plugin_version
diff --git a/o3d/installer/win/o3d_plugin.wxs b/o3d/installer/win/o3d_plugin.wxs
new file mode 100644
index 0000000..daaddf6a
--- /dev/null
+++ b/o3d/installer/win/o3d_plugin.wxs
@@ -0,0 +1,345 @@
+<?xml version='1.0' encoding='windows-1252'?>
+
+<!--
+Copyright 2009, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<!--
+Wix script for building o3d installer.
+-->
+
+<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>
+
+ <Product Name='O3D Plugin' Id='$(var.NppProductGuid)'
+ Language='1033' Codepage='1252' Version='$(var.NppVersion)'
+ Manufacturer='Google' UpgradeCode='$(var.NppUpgradeCode)'>
+
+ <Package Id='$(var.NppPackageGuid)' Keywords='Installer'
+ Description='O3D Plugin Installer' Manufacturer='Google'
+ InstallerVersion='101' InstallPrivileges='limited'
+ Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+
+ <Media Id='1' Cabinet='o3dplugin.cab' EmbedCab='yes'
+ CompressionLevel='high'/>
+
+ <!-- Checks if the custom action for detecting directx has failed
+ and displays an error message if that is the case. -->
+ <Condition
+ Message='O3D needs an installation of DirectX 9.0c or higher. Please download the latest version of DirectX from http://www.microsoft.com/download.'>
+ DIRECTX_9_0_C_INSTALLED
+ </Condition>
+
+ <!-- Prevent silent updates from installing if O3D is running.
+ If UILevel is less than or equal to 2, the update is silent.
+ If UILevel is greater than 2, the update is not silent.
+ The message should never be seen since this condition will attempt
+ to display the message only when the install is silent. -->
+ <Condition
+ Message='Please first close any running instances of O3D.'>
+ UILevel > 2 OR NOT (SOFTWARE_RUNNING) OR REMOVE ~= "ALL"
+ </Condition>
+
+ <!-- Copy the plugin to the mozilla plugin folder under
+ 'Documents and Settings' -->
+ <Directory Id='TARGETDIR' Name='SourceDir'>
+ <Directory Id='AppDataFolder' Name='QFiles'>
+ <Directory Id='pu.MozillaDir' Name='Mozilla'>
+ <Directory Id='pu.FirefoxPluginsDir' Name='plugins'>
+ <Component Id='pu.Npdll' Guid='$(var.NppComponentGuid)'>
+ <File Id='pu.GoogleNpapiDll.dll' Name='npo3d.dll'
+ LongName='npo3dautoplugin.dll' DiskId='1'
+ Source='$(var.NPPluginPath)' Vital='yes' />
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+ </Directory>
+ <Directory Id='Google' Name='Google'>
+ <Directory Id='O3D' Name='O3D'>
+ <Component Id='InstallReporter' Guid='$(var.RepGuid)'>
+ <File
+ Id='Reporter'
+ Name='reporter.exe'
+ DiskId='1'
+ Source='$(var.RepPath)'
+ Vital='yes'/>
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ <Component Id='InstallDriverBlacklist' Guid='$(var.DBLGuid)'>
+ <!-- Note: the "Name" here is required, but is overridden by
+ the "LongName". -->
+ <File
+ Id='DriverBlacklist'
+ Name='BadDrvrs.txt'
+ LongName='driver_blacklist.txt'
+ DiskId='1'
+ Source='$(var.DBLPath)'
+ Vital='yes'/>
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ <Component Id='pu.IEdll'
+ Guid='$(var.IepComponentGuid)'>
+ <File Id='pu.GoogleActiveXDll.dll' Name='o3d_host.dll'
+ DiskId='1' Source='$(var.IEPluginPath)' Vital='yes'/>
+ <!-- We add all of these registry values here, instead
+ of running regsvr32 on the dll because otherwise we
+ leave cruft behind if the dll is manually removed
+ or corrupted.
+
+ If COM interfaces are added to the DLL, you can
+ recreate this list by running the RegCap.exe tool
+ (part of Visual Studio) to extract the list of
+ registry entries from o3d_host.dll, and then use
+ tallow.exe (part of WiX) to convert that .reg file
+ to WiX XML form. -->
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.NPObjectProxy.1"
+ Value="NPObjectProxy Class" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.NPObjectProxy.1\CLSID"
+ Value="{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.NPObjectProxy.1\Insertable" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.NPObjectProxy"
+ Value="NPObjectProxy Class" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.NPObjectProxy\CLSID"
+ Value="{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.NPObjectProxy\CurVer"
+ Value="o3d_host.NPObjectProxy.1" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}"
+ Value="NPObjectProxy Class" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\ProgID"
+ Value="o3d_host.NPObjectProxy.1" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\VersionIndependentProgID"
+ Value="o3d_host.NPObjectProxy" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\Programmable" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\InprocServer32"
+ Value="[#pu.GoogleActiveXDll.dll]" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\InprocServer32"
+ Name="ThreadingModel" Value="Apartment" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\Control" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\Insertable" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\TypeLib"
+ Value="{D4F6E31C-E952-48FE-9833-6AE308BD79C6}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{1D68424D-7A71-4b61-AE5C-56DBCD8B0E53}\Version"
+ Value="1.0" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}"
+ Value="O3DHostControl Class" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\ProgID"
+ Value="o3d_host.O3DHostControl.1" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\VersionIndependentProgID"
+ Value="o3d_host.O3DHostControl" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Programmable" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\InprocServer32"
+ Value="[#pu.GoogleActiveXDll.dll]" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\InprocServer32"
+ Name="ThreadingModel" Value="Apartment" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Control" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Insertable" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\ToolboxBitmap32"
+ Value="[#pu.GoogleActiveXDll.dll], 102" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\MiscStatus"
+ Value="0" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\MiscStatus\1"
+ Value="131473" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\TypeLib"
+ Value="{D4F6E31C-E952-48FE-9833-6AE308BD79C6}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Version"
+ Value="1.0" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Implemented Categories" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}" />
+ <Registry Root="HKCU" Key="Software\Classes\CLSID\{9666A772-407E-4F90-BC37-982E8160EB2D}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.O3DHostControl.1"
+ Value="O3DHostControl Class" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.O3DHostControl.1\CLSID"
+ Value="{9666A772-407E-4F90-BC37-982E8160EB2D}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.O3DHostControl.1\Insertable" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.O3DHostControl"
+ Value="O3DHostControl Class" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.O3DHostControl\CLSID"
+ Value="{9666A772-407E-4F90-BC37-982E8160EB2D}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\o3d_host.O3DHostControl\CurVer"
+ Value="o3d_host.O3DHostControl.1" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\TypeLib" />
+ <Registry Root="HKCU" Key="Software\Classes\TypeLib\{D4F6E31C-E952-48FE-9833-6AE308BD79C6}" />
+ <Registry Root="HKCU" Key="Software\Classes\TypeLib\{D4F6E31C-E952-48FE-9833-6AE308BD79C6}\1.0"
+ Value="npapi_host2 1.0 Type Library" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\TypeLib\{D4F6E31C-E952-48FE-9833-6AE308BD79C6}\1.0\FLAGS"
+ Value="0" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\TypeLib\{D4F6E31C-E952-48FE-9833-6AE308BD79C6}\1.0\0" />
+ <Registry Root="HKCU" Key="Software\Classes\TypeLib\{D4F6E31C-E952-48FE-9833-6AE308BD79C6}\1.0\0\win32"
+ Value="[#pu.GoogleActiveXDll.dll]" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\Interface" />
+ <Registry Root="HKCU" Key="Software\Classes\Interface\{56D79537-181C-4A38-ADF5-E12EC24D7FC7}"
+ Value="IHostControl" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\Interface\{56D79537-181C-4A38-ADF5-E12EC24D7FC7}\ProxyStubClsid"
+ Value="{00020424-0000-0000-C000-000000000046}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\Interface\{56D79537-181C-4A38-ADF5-E12EC24D7FC7}\ProxyStubClsid32"
+ Value="{00020424-0000-0000-C000-000000000046}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\Interface\{56D79537-181C-4A38-ADF5-E12EC24D7FC7}\TypeLib"
+ Value="{D4F6E31C-E952-48FE-9833-6AE308BD79C6}" Type="string" />
+ <Registry Root="HKCU" Key="Software\Classes\Interface\{56D79537-181C-4A38-ADF5-E12EC24D7FC7}\TypeLib"
+ Name="Version" Value="1.0" Type="string" />
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+ </Directory>
+ </Directory>
+ <Directory Id='TempFolder' Name='TmpFiles'>
+ <!-- This continues to run after we exit, so we don't clean it up.
+ It's in the temp dir, so that's not so bad. It *must* be placed where
+ performondemand.cc is expecting it to be!
+ TODO: Figure out how to get it removed as of the next reboot.
+ TODO: We also don't remove the extras on uninstall. We don't
+ want to on upgrade, just on a full uninstall; can we tell the
+ difference? -->
+ <Directory Id='ExtrasTempDir' Name='Extras'>
+ <Component Id='GetExtras'
+ Guid='$(var.GetExtrasGuid)'>
+ <File Id='getextras' Name="getxtras" LongName='getextras.exe'
+ DiskId='1' src='$(var.GetExtrasPath)' />
+ </Component>
+ </Directory>
+ </Directory>
+
+ <!-- Write the current version of the plugin to the Google Update
+ registry key for auto update. -->
+ <Component Id='pu.UpdaterReg' Guid='$(var.NppGoogleUpdateRegGuid)'>
+ <Registry Id='pu.UpdaterRegistryKeys' Root='HKCU'
+ Key='$(var.NppGoogleUpdateRegKey)'
+ Name='pv' Value='$(var.NppVersion)' Action='write'
+ Type='string' />
+ <Registry Id='pu.UpdaterRegistryKeys2' Root='HKCU'
+ Key='$(var.NppGoogleUpdateRegKey)'
+ Name='name' Value='o3d' Action='write'
+ Type='string' />
+ <Registry Id='pu.UpdaterRegistryKeys3' Root='HKCU'
+ Key='$(var.NppGoogleUpdateRegKey)'
+ Name='lang' Value='en' Action='write'
+ Type='string' />
+ <Registry Id='pu.TrackReg' Root='HKCU'
+ Key='$(var.NppGoogleUpdateStateRegKey)'
+ Name='dr' Value='0' Action='write'
+ Type='string' />
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+
+ <!-- List of actions to be performed. -->
+ <Feature Id='G3DPlugin' Title='O3D Plugin' Level='1'>
+ <ComponentRef Id='GetExtras' />
+ <ComponentRef Id='pu.Npdll' />
+ <ComponentRef Id='pu.IEdll'/>
+ <ComponentRef Id='pu.UpdaterReg' />
+ <ComponentRef Id='InstallReporter'/>
+ <ComponentRef Id='InstallDriverBlacklist'/>
+ </Feature>
+
+ <!-- Identify previous versions to remove before installing. The deprecated
+ one dates to when we accidentally used the same upgrade code for the
+ SDK and the plugin, so they'll both try to uninstall it, just in case.
+ At worst, the user will have one or the other disappear mysteriously,
+ but only once.
+ -->
+ <Upgrade Id='$(var.DeprecatedUpgradeCode)'>
+ <UpgradeVersion OnlyDetect='no' Property='UPGRADING_DEPR'/>
+ </Upgrade>
+ <Upgrade Id='$(var.NppUpgradeCode)'>
+ <UpgradeVersion
+ Minimum='0.0.0.0' IncludeMinimum='yes'
+ Maximum='$(var.NppVersion)' IncludeMaximum='yes'
+ OnlyDetect='no' Property='UPGRADING'/>
+ </Upgrade>
+
+ <!-- Custom action to tell CheckDirectX where to report errors. -->
+ <CustomAction
+ Id='SetupGoogleUpdateRegistryKey'
+ Property='GoogleUpdateResultKey'
+ Value='$(var.NppGoogleUpdateStateRegKey)' />
+ <!-- Custom action for detecting DirectX 9.0c or higher. -->
+ <CustomAction
+ Id='CheckDirectX'
+ BinaryKey='CustomActions'
+ DllEntry='CheckDirectX' />
+
+ <!-- Custom action for checking that we're not already running. -->
+ <CustomAction
+ Id='IsSoftwareRunning'
+ BinaryKey='CustomActions'
+ DllEntry='IsSoftwareRunning' />
+
+ <Binary
+ Id='CustomActions'
+ SourceFile='cactions.dll' />
+
+ <!-- Custom action for telling Google Update to install d3dx if necessary. -->
+ <CustomAction
+ Id='InstallD3DXIfNeeded'
+ BinaryKey='CustomActions'
+ DllEntry='InstallD3DXIfNeeded'
+ Execute='deferred' />
+
+ <!-- Custom action needs to be in the InstallUISequence to make
+ sure it has been executed before the Condition check. -->
+ <InstallUISequence>
+ <Custom
+ Action='SetupGoogleUpdateRegistryKey'
+ Before='CheckDirectX' />
+ <Custom
+ Action='IsSoftwareRunning'
+ Before='CheckDirectX' />
+ <Custom
+ Action='CheckDirectX'
+ Before='LaunchConditions' />
+ </InstallUISequence>
+
+ <InstallExecuteSequence>
+ <Custom
+ Action='SetupGoogleUpdateRegistryKey'
+ Before='CheckDirectX' />
+ <Custom
+ Action='IsSoftwareRunning'
+ Before='CheckDirectX' />
+ <Custom
+ Action='CheckDirectX'
+ Before='LaunchConditions' />
+ <Custom
+ Action='InstallD3DXIfNeeded'
+ After='InstallFiles'>
+ NOT Installed
+ </Custom>
+ <UnregisterClassInfo>
+ (REMOVE="ALL") OR UPGRADING OR UPGRADING_DEPR
+ </UnregisterClassInfo>
+ <RemoveExistingProducts After='InstallInitialize'>
+ UPGRADING OR UPGRADING_DEPR
+ </RemoveExistingProducts>
+ <RegisterClassInfo/>
+ </InstallExecuteSequence>
+
+ </Product>
+</Wix>
diff --git a/o3d/installer/win/o3d_sdk.wxs b/o3d/installer/win/o3d_sdk.wxs
new file mode 100644
index 0000000..b3dcaa0
--- /dev/null
+++ b/o3d/installer/win/o3d_sdk.wxs
@@ -0,0 +1,223 @@
+<?xml version='1.0' encoding='windows-1252'?>
+
+<!--
+Copyright 2009, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<!--
+ Wix script for building o3d installer.
+-->
+
+<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>
+
+ <Product Name='O3D SDK' Id='$(var.SDKProductGuid)'
+ Language='1033' Codepage='1252' Version='$(var.SDKVersion)'
+ Manufacturer='Google' UpgradeCode='$(var.SDKUpgradeCode)'>
+ <Package Id='$(var.SDKPackageGuid)' Keywords='Installer'
+ Description='O3D SDK Installer' Manufacturer='Google'
+ InstallerVersion='101' InstallPrivileges='limited'
+ Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+
+ <Media Id='1' Cabinet='o3dSDK.cab' EmbedCab='yes'
+ CompressionLevel='high'/>
+
+ <!-- Checks if the custom action for detecting directx has failed
+ and displays an error message if that is the case. -->
+ <Condition
+ Message='O3D needs an installation of DirectX 9.0c or higher. Please download the latest version of DirectX from http://www.microsoft.com/download.'>
+ DIRECTX_9_0_C_INSTALLED
+ </Condition>
+
+ <Directory
+ Id='TARGETDIR'
+ Name='SourceDir'>
+ <Directory
+ Id='ProgramMenuFolder'
+ Name='PMenu'
+ LongName='Programs'>
+ <Directory
+ Id='ProgramMenuDir'
+ Name='O3D'
+ LongName='O3D' />
+ </Directory>
+ <!-- Start menu items. -->
+ <Directory
+ Id='AppDataFolder'
+ Name='QMenu'>
+ <Directory
+ Id='Google'
+ Name='Google'>
+ <Directory
+ Id='O3D'
+ Name='O3D'>
+ <Directory
+ Id='INSTALLDIR'
+ Name='O3D'
+ LongName='O3D' />
+ <?include docs.wxs ?>
+ <!-- Collada items. -->
+ <Component Id='InstallCollada' Guid='$(var.SDKColladaGuid)'>
+ <File
+ Id='O3DSDKCollada'
+ Name='o3dCond.exe'
+ LongName='o3dConditioner.exe'
+ DiskId='1'
+ Source='$(var.SDKColladaPath)'>
+ <Shortcut
+ Id="O3DSDKColladaShortcut"
+ Directory="ProgramMenuDir"
+ Name="o3dCond.exe"
+ LongName="Collada Conditioner"/>
+ </File>
+ <File
+ Id='CGLib1'
+ Name='cg.dll'
+ LongName='cg.dll'
+ DiskId='1'
+ Source='$(var.SDKCG1Path)'/>
+ <File
+ Id='CGLib2'
+ Name='cgGL.dll'
+ LongName='cgGL.dll'
+ DiskId='1'
+ Source='$(var.SDKCG2Path)'/>
+ <File
+ Id='CGC'
+ Name='cgc.exe'
+ LongName='cgc.exe'
+ DiskId='1'
+ Source='$(var.SDKCGCPath)'/>
+ <!-- We're just dropping this dll in here for now. Later, if we
+ want to save space, we can do the same download-on-demand of the
+ extras package that the plugin does. That will require the
+ conditioner/exporter to use LoadLibrary to load d3dx9_36.dll,
+ however. -->
+ <File
+ Id='D3DX9'
+ Name='d3dx9_36.dll'
+ LongName='d3dx9_36.dll'
+ DiskId='1'
+ Source='$(var.DxRedistPath)\d3dx9_36.dll'/>
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+ </Directory>
+ </Directory>
+ <!-- Write the current version of the plugin to the Google Update
+ registry key for auto update. -->
+ <Component Id='UpdaterReg' Guid='$(var.SDKGoogleUpdateRegGuid)'>
+ <Registry Id='pu.UpdaterRegistryKeys' Root='HKCU'
+ Key='$(var.SDKGoogleUpdateRegKey)'
+ Name='pv' Value='$(var.SDKVersion)' Action='write'
+ Type='string' />
+ <Registry Id='pu.UpdaterRegistryKeys2' Root='HKCU'
+ Key='$(var.SDKGoogleUpdateRegKey)'
+ Name='name' Value='o3d_sdk' Action='write'
+ Type='string' />
+ <Registry Id='pu.UpdaterRegistryKeys3' Root='HKCU'
+ Key='$(var.SDKGoogleUpdateRegKey)'
+ Name='lang' Value='en' Action='write'
+ Type='string' />
+ <Condition>NOT (ALLUSERS)</Condition>
+ </Component>
+ </Directory>
+
+ <?include docs_features.wxs ?>
+ <Feature
+ Id='SDKCollada'
+ Level='1'>
+ <ComponentRef
+ Id='InstallCollada'/>
+ </Feature>
+ <Feature
+ Id='UpdateRegistry'
+ Level='1'>
+ <ComponentRef
+ Id='UpdaterReg'/>
+ </Feature>
+
+ <!-- Identify previous versions to remove before installing. The deprecated
+ one dates to when we accidentally used the same upgrade code for the SDK and
+ the plugin, so they'll both try to uninstall it, just in case. At worst,
+ the user will have one or the other disappear mysteriously, but only once.
+ -->
+ <Upgrade Id='$(var.DeprecatedUpgradeCode)'>
+ <UpgradeVersion OnlyDetect='no' Property='UPGRADING_DEPR'/>
+ </Upgrade>
+ <Upgrade Id='$(var.SDKUpgradeCode)'>
+ <UpgradeVersion
+ Minimum='0.0.0.0' IncludeMinimum='yes'
+ Maximum='$(var.SDKVersion)' IncludeMaximum='yes'
+ OnlyDetect='no' Property='UPGRADING'/>
+ </Upgrade>
+
+ <!-- Custom action for detecting DirectX 9.0c or higher. -->
+ <CustomAction
+ Id='CheckDirectX'
+ BinaryKey='CustomActions'
+ DllEntry='CheckDirectX' />
+
+ <Binary
+ Id='CustomActions'
+ SourceFile='cactions.dll' />
+
+ <InstallExecuteSequence>
+ <!-- We have to FindRelatedProducts before the LaunchConditions checks,
+ so that we know if we're upgrading before we tell folks they need to be
+ administrators. LaunchConditions happens at sequence number 100, and
+ CheckDirectX is 99. -->
+ <FindRelatedProducts Sequence='98' />
+ <Custom
+ Action='CheckDirectX'
+ Before='LaunchConditions' />
+ <UnregisterClassInfo>
+ (REMOVE="ALL") OR UPGRADING OR UPGRADING_DEPR
+ </UnregisterClassInfo>
+ <RemoveExistingProducts After='InstallInitialize'>
+ UPGRADING OR UPGRADING_DEPR
+ </RemoveExistingProducts>
+ <RegisterClassInfo/>
+ </InstallExecuteSequence>
+
+ <!-- Custom action needs to be in the InstallUISequence to make
+ sure it has been executed before the Condition check. -->
+ <InstallUISequence>
+ <FindRelatedProducts Sequence='98' />
+ <!-- We have to FindRelatedProducts before the LaunchConditions checks,
+ so that we know if we're upgrading before we tell folks they need to be
+ administrators. LaunchConditions happens at sequence number 100, and
+ CheckDirectX is 99. -->
+ <Custom
+ Action='CheckDirectX'
+ Before='LaunchConditions' />
+ </InstallUISequence>
+
+ </Product>
+</Wix>
diff --git a/o3d/installer/win/o3d_version.py b/o3d/installer/win/o3d_version.py
new file mode 100644
index 0000000..ac48c54
--- /dev/null
+++ b/o3d/installer/win/o3d_version.py
@@ -0,0 +1,6 @@
+#!/usr/bin/python2.4
+# Copyright 2008 Google Inc. All Rights Reserved.
+
+# version = (major, minor, trunk, patch)
+plugin_version = (0, 1, 35, 0)
+sdk_version = plugin_version