summaryrefslogtreecommitdiffstats
path: root/o3d/installer
diff options
context:
space:
mode:
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