This commit is contained in:
Shyotl
2018-08-07 21:46:07 -05:00
59 changed files with 5058 additions and 7807 deletions

View File

@@ -120,18 +120,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>586739a99e1366cd9e270dc7c9a4e519</string>
<string>1e7eb1da6e3e792db85f59012680a877</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/apr_suite-1.5.2-windows64-201603261452.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/apr_suite-1.6.3-1.6.1-1.2.2-windows64-201712260041.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.5.2</string>
<string>1.6.3-1.6.1-1.2.2</string>
</map>
<key>ares</key>
<map>
@@ -292,18 +292,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>f2ff62721cffd4556d18cbec67152de1</string>
<string>6faba32dcfb80c26bafd4a3e06cff268</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/boost-1.60.0-windows64-201601160313.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/boost-1.66.0-windows64-201712260832.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.60.0</string>
<string>1.66.0</string>
</map>
<key>colladadom</key>
<map>
@@ -376,11 +376,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>46e48bcb7643c4819bf6f35f518a0db7</string>
<string>65628150b732274f0bdd0fa33d6ca650</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/colladadom-2.3-windows64-201601160353.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/colladadom-2.3-windows64-201712260938.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -392,7 +392,7 @@
<key>curl</key>
<map>
<key>copyright</key>
<string>Copyright (c) 1996 - 2016, Daniel Stenberg, (daniel@haxx.se).</string>
<string>Copyright (c) 1996 - 2017, Daniel Stenberg,(daniel@haxx.se), and many contributors.</string>
<key>description</key>
<string>Library for transferring data specified with URL syntax</string>
<key>license</key>
@@ -462,18 +462,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>86feef4905c2e46a9cbdc7a1df23d83f</string>
<string>7b56b59c56389a8943a04b24bb22ada4</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/curl-7.48.0-windows64-201603231658.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/curl-7.57.0-windows64-201712260745.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>7.48.0</string>
<string>7.57.0</string>
</map>
<key>dbus-glib</key>
<map>
@@ -510,7 +510,7 @@
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/linux64/lib/dbus_glib-0.76-linux64-201501030130.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/linux64/lib/dbus_glib-0.76-linux64-201501030130.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@@ -542,7 +542,7 @@
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/common/lib/dictionaries-1-common-201412301501.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/common/lib/dictionaries-1-common-201412301501.tar.bz2</string>
</map>
<key>name</key>
<string>common</string>
@@ -554,7 +554,7 @@
<key>expat</key>
<map>
<key>copyright</key>
<string>Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.</string>
<string>Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001-2017 Expat maintainers</string>
<key>description</key>
<string>Expat is an XML parser library written in C</string>
<key>license</key>
@@ -624,18 +624,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>0cf6f4529ade22b7ae78da5d6303ed87</string>
<string>db56a24bbac59d9ad8b98d40b7140c29</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/expat-2.1.1-windows64-201603261406.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/expat-2.2.5-windows64-201712251923.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>2.1.1</string>
<string>2.2.5</string>
</map>
<key>fmodstudio</key>
<map>
@@ -712,18 +712,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>13ac02d0444e46c17fa20c20a9828647</string>
<string>c2c45c2ebd9fd930098aa2a3b85bbe5f</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>https://depot.alchemyviewer.org/pub/windows64/lib/fmodstudio-1.08.04-windows64-201605291157.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib/fmodstudio-1.10.02-windows64-201712251435.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.08.04</string>
<string>1.10.02</string>
</map>
<key>fontconfig</key>
<map>
@@ -818,7 +818,7 @@
<key>freetype</key>
<map>
<key>copyright</key>
<string>Copyright 2006-2016 by David Turner, Robert Wilhelm, and Werner Lemberg.</string>
<string>Copyright 2006-2017 by David Turner, Robert Wilhelm, and Werner Lemberg.</string>
<key>description</key>
<string>Font rendering library</string>
<key>license</key>
@@ -888,18 +888,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>e8c0acbe631d7a4cb1a2890b90e5bc8c</string>
<string>7c028ec152b1dee1313c084d96a5d276</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/freetype-2.6.3-windows64-201603011807.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/freetype-2.8.1-windows64-201712260751.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>2.6.3</string>
<string>2.8.1</string>
</map>
<key>glext</key>
<map>
@@ -1038,11 +1038,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>2da9e546e4f574ec79ea8962f2c962da</string>
<string>c5c04c164ff057a43928de2f2b83470e</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/glod-1.0pre4-windows64-201512092328.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/glod-1.0pre4-windows64-201712251340.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -1124,11 +1124,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>e74e54c2042b1539a81012501e4b67af</string>
<string>71ffc5cae4da7e2e7aac856da44cb8c4</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/google_breakpad-9e60a27-windows64-201512101817.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc141/google_breakpad-7398ce15b79da-windows64-201703081616.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -1338,18 +1338,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>982395e50a36334899b900d563003b83</string>
<string>d60f195778344b88cc47dc5e19af2cf8</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/jpeglib-1.4.2-windows64-201512092307.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/jpeglib-1.5.3-windows64-201712251431.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.4.2</string>
<string>1.5.3</string>
</map>
<key>jsoncpp</key>
<map>
@@ -1424,18 +1424,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>4cfc311430b84c8a9eba472fd4469f2e</string>
<string>592a4145fcc71be4ddae58b265885382</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/jsoncpp-1.6.5-windows64-201512092309.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/jsoncpp-1.8.4-windows64-201712251058.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.6.5</string>
<string>1.8.4</string>
</map>
<key>libhunspell</key>
<map>
@@ -1510,11 +1510,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>202ec606e90c6a705bc075c334d76f86</string>
<string>46e0276052dc614fe890f2a5d6f814b9</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libhunspell-1.3.3-windows64-201512100002.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/libhunspell-1.6.2-windows64-201712251236.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -1616,11 +1616,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>37da82fd6de8673a46c2c0860b54d6bf</string>
<string>3ac8047b38b617ad686591e00100d6af</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libndofdev-0.1-windows64-201512122040.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/libndofdev-0.1-windows64-201712251124.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -1664,7 +1664,7 @@
<key>libpng</key>
<map>
<key>copyright</key>
<string>Copyright (c) 2004, 2006-2016 Glenn Randers-Pehrson</string>
<string>Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson</string>
<key>description</key>
<string>PNG Reference library</string>
<key>license</key>
@@ -1734,18 +1734,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>b2f166e496fc19958777c92ffd032331</string>
<string>528889464c0766d762bd528cf82558db</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libpng-1.6.21-windows64-201603011809.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/libpng-1.6.34-windows64-201712260746.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.6.21</string>
<string>1.6.34</string>
</map>
<key>libxml2</key>
<map>
@@ -1820,11 +1820,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>4453be9f68208147e4a7d508db677583</string>
<string>f69b1d4ec7ffdeec4429413ea640583d</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libxml2-2.9.3-windows64-201512122133.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/libxml2-2.9.7-windows64-201712260755.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -2044,18 +2044,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>3058f1de30b4738bb087a21561cdd9a8</string>
<string>619598988143e12ad0d1a271f881b3bd</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/devel/secondlife/packages/windows64/nvapi-R361v2-windows64-201604020338.tar.bz2</string>
<string>file:///c:/devel/secondlife/packages/windows64/nvapi-R384-windows64-201712260642.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>R361v2</string>
<string>R384</string>
</map>
<key>ogg_vorbis</key>
<map>
@@ -2130,11 +2130,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>c22591d8db9dc3353e4d3dc3d1a2b264</string>
<string>01ae2d298489ea66597c5e302e8e4525</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/ogg_vorbis-1.3.2-1.3.5-windows64-201512122053.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/ogg_vorbis-1.3.2-1.3.5-windows64-201712251411.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -2222,14 +2222,14 @@
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib/openal-1.16.0-1.1.0-windows64-201504270534.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib/openal-1.16.0-1.1.0-windows64-201504270534.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.16.0-1.1.0</string>
<string>1.17.2-1.1.0</string>
</map>
<key>openssl</key>
<map>
@@ -2304,18 +2304,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>ec86d96ffcbdc10e715e27b4b0bbda43</string>
<string>bd35903f309ccf026a2c448fd8613cc0</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/openssl-1.0.2g-windows64-201603011842.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/openssl-1.1.0g-windows64-201712260729.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.0.2g</string>
<string>1.1.0g</string>
</map>
<key>quicktime</key>
<map>
@@ -2408,32 +2408,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>399afab7047e6fa62e7b2fb1768059ea</string>
<string>47a3316dae47cc4e7c1ea7b74ba8dd1e</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/CYGWIN/installer/slvoice-4.6.0017.21209.298329-windows-298329.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/vivox_3p-slvoice/rev/302004/arch/CYGWIN/installer/slvoice-4.6.0017.22050.302004-windows-302004.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
<key>windows64</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>dabbc146137c13ec2ea026aa69e1f045</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib/slvoice-4.6.0017.21209.298329-windows64-298329.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>4.6.0017.21209.298329</string>
<string>4.6.0017.22050</string>
</map>
<key>tut</key>
<map>
@@ -2458,7 +2444,7 @@
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/common/lib/tut-2008.11.30-common-201504282317.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/common/lib/tut-2008.11.30-common-201504282317.tar.bz2</string>
</map>
<key>name</key>
<string>common</string>
@@ -2540,11 +2526,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>dae3118551880f593f8ee907c122f097</string>
<string>ad1a435de73b7ee6d07f6c81a4cb1910</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/uriparser-0.8.4-windows64-201512081840.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/uriparser-0.8.4-windows64-201712251116.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -2572,11 +2558,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>a38ec464042e1d5e67231d9bcd181ae2</string>
<string>f193ec9e594d857d22c067c6e52622a9</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>https://depot.alchemyviewer.org/pub/windows/lib-vc14/vcredist-14.0.23918.0-windows-201606250656.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows/lib-vc141/vcredist-14.10.25017.0-windows-201705270440.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -2586,18 +2572,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>0d688527ab7d08f6b7c7a5f73175e4f8</string>
<string>e895f4b5d24b372a360c3a8fe3bc0398</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc14/vcredist-14.0.23918.0-windows64-201606250656.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/vcredist-14.12.25810.0-windows64-201712251445.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>14.0.23918.0</string>
<string>14.12.25810.0</string>
</map>
<key>xmlrpc-epi</key>
<map>
@@ -2672,11 +2658,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>1afa5a6bdbc5689e14120628dc0fc124</string>
<string>59f0be2732e93eceaa155d98c2fcee9c</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/xmlrpc_epi-0.54.2-windows64-201603261459.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/xmlrpc_epi-0.54.2-windows64-201712260035.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@@ -2688,7 +2674,7 @@
<key>zlib</key>
<map>
<key>copyright</key>
<string>Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler</string>
<string>Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler</string>
<key>description</key>
<string>Zlib Data Compression Library</string>
<key>license</key>
@@ -2758,18 +2744,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>5b3a58a6a939e83f94137171b7f814de</string>
<string>ed6da4296e2fdfc132b4f12d35890ada</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://depot.alchemyviewer.org/pub/windows64/lib-vc14/zlib-1.2.8-windows64-201512071625.tar.bz2</string>
<string>https://depot.alchemyviewer.org/pub/windows64/lib-vc142/zlib-1.2.11-windows64-201712260711.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.2.8</string>
<string>1.2.11</string>
</map>
</map>
<key>package_description</key>
@@ -3013,7 +2999,7 @@
<key>windows</key>
<map>
<key>build_directory</key>
<string>build-vc140</string>
<string>build-vc141</string>
<key>configurations</key>
<map>
<key>RelWithDebInfo</key>
@@ -3041,20 +3027,12 @@
<key>arguments</key>
<array>
<string>..\indra</string>
<string>&amp;&amp;</string>
<string>..\indra\tools\vstool\VSTool.exe</string>
<string>--solution</string>
<string>Singularity.sln</string>
<string>--config</string>
<string>RelWithDebInfo</string>
<string>--startup</string>
<string>singularity-bin</string>
</array>
<key>options</key>
<array>
<string>-G</string>
<string>"Visual Studio 14"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.10586.0"</string>
<string>"Visual Studio 15"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.16299.0"</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>
</map>
@@ -3088,20 +3066,12 @@
<key>arguments</key>
<array>
<string>..\indra</string>
<string>&amp;&amp;</string>
<string>..\indra\tools\vstool\VSTool.exe</string>
<string>--solution</string>
<string>Singularity.sln</string>
<string>--config</string>
<string>Release</string>
<string>--startup</string>
<string>singularity-bin</string>
</array>
<key>options</key>
<array>
<string>-G</string>
<string>"Visual Studio 14"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.10586.0"</string>
<string>"Visual Studio 15"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.16299.0"</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>
</map>
@@ -3115,7 +3085,7 @@
<key>windows64</key>
<map>
<key>build_directory</key>
<string>build-vc140-x86_64</string>
<string>build-vc141-x86_64</string>
<key>configurations</key>
<map>
<key>RelWithDebInfo</key>
@@ -3143,20 +3113,12 @@
<key>arguments</key>
<array>
<string>..\indra</string>
<string>&amp;&amp;</string>
<string>..\indra\tools\vstool\VSTool.exe</string>
<string>--solution</string>
<string>Singularity.sln</string>
<string>--config</string>
<string>RelWithDebInfo</string>
<string>--startup</string>
<string>singularity-bin</string>
</array>
<key>options</key>
<array>
<string>-G</string>
<string>"Visual Studio 14 Win64"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.10586.0"</string>
<string>"Visual Studio 15 Win64"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.16299.0"</string>
<string>-DWORD_SIZE:STRING=64</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>
@@ -3191,20 +3153,12 @@
<key>arguments</key>
<array>
<string>..\indra</string>
<string>&amp;&amp;</string>
<string>..\indra\tools\vstool\VSTool.exe</string>
<string>--solution</string>
<string>Singularity.sln</string>
<string>--config</string>
<string>Release</string>
<string>--startup</string>
<string>singularity-bin</string>
</array>
<key>options</key>
<array>
<string>-G</string>
<string>"Visual Studio 14 Win64"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.10586.0"</string>
<string>"Visual Studio 15 Win64"</string>
<string>-DCMAKE_SYSTEM_VERSION="10.0.16299.0"</string>
<string>-DWORD_SIZE:STRING=64</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
</array>

View File

@@ -10,8 +10,8 @@ else (STANDALONE)
use_prebuilt_binary(curl)
if (WINDOWS)
set(CURL_LIBRARIES
debug libcurld
optimized libcurl)
debug libcurl_a_debug
optimized libcurl_a)
else (WINDOWS)
use_prebuilt_binary(libidn)
set(CURL_LIBRARIES curl idn)

View File

@@ -22,10 +22,8 @@ if(WINDOWS)
SLVoice.exe
ca-bundle.crt
libsndfile-1.dll
vivoxplatform.dll
vivoxsdk.dll
ortp.dll
zlib1.dll
vivoxoal.dll
)
@@ -37,8 +35,6 @@ if(WINDOWS)
libapr-1.dll
libaprutil-1.dll
libapriconv-1.dll
ssleay32.dll
libeay32.dll
glod.dll
libhunspell.dll
)
@@ -48,12 +44,30 @@ if(WINDOWS)
libapr-1.dll
libaprutil-1.dll
libapriconv-1.dll
ssleay32.dll
libeay32.dll
glod.dll
libhunspell.dll
)
if(WORD_SIZE STREQUAL 64)
list(APPEND debug_files
libcrypto-1_1-x64.dll
libssl-1_1-x64.dll
)
list(APPEND release_files
libcrypto-1_1-x64.dll
libssl-1_1-x64.dll
)
else(WORD_SIZE STREQUAL 64)
list(APPEND debug_files
libcrypto-1_1.dll
libssl-1_1.dll
)
list(APPEND release_files
libcrypto-1_1.dll
libssl-1_1.dll
)
endif(WORD_SIZE STREQUAL 64)
if(NOT DISABLE_TCMALLOC)
set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll)
set(release_files ${release_files} libtcmalloc_minimal.dll)

View File

@@ -9,7 +9,7 @@ if (STANDALONE OR USE_SYSTEM_OPENSSL)
else (STANDALONE OR USE_SYSTEM_OPENSSL)
use_prebuilt_binary(openssl)
if (WINDOWS)
set(OPENSSL_LIBRARIES ssleay32 libeay32)
set(OPENSSL_LIBRARIES libssl libcrypto)
else (WINDOWS)
set(OPENSSL_LIBRARIES ssl)
endif (WINDOWS)

View File

@@ -53,7 +53,7 @@
// Windows uses structured exceptions, so it's handled a bit differently.
//
#if LL_WINDOWS
#include "windows.h"
#include <windows.h>
LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop);
BOOL ConsoleCtrlHandler(DWORD fdwCtrlType);

View File

@@ -33,6 +33,8 @@
#include <sys/param.h> // Need PATH_MAX in APR headers...
#endif
#include "llwin32headerslean.h"
#include <boost/noncopyable.hpp>
#include "apr_thread_proc.h"

View File

@@ -33,9 +33,7 @@
#ifndef LL_LLPROCESSLAUNCHER_H
#define LL_LLPROCESSLAUNCHER_H
#if LL_WINDOWS
#include <windows.h>
#endif
#include "llwin32headerslean.h"
/*

View File

@@ -33,6 +33,7 @@
#endif
#undef WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2ipdef.h>
#include <windows.h>
// reset to default, which is lean
#define WIN32_LEAN_AND_MEAN

View File

@@ -33,6 +33,7 @@
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2ipdef.h>
#include <windows.h>
#undef NOMINMAX
#endif

View File

@@ -244,6 +244,9 @@ public:
// Src and dst are same size. Src has 4 components. Dst has 3 components.
void compositeUnscaled4onto3( LLImageRaw* src );
std::string getComment() const { return mComment; }
std::string mComment;
protected:
// Create an image from a local file (generally used in tools)

View File

@@ -1,31 +1,25 @@
/**
* @file llimagebmp.cpp
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
* Copyright (c) 2001-2009, Linden Research, Inc.
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -81,7 +75,7 @@ LLImageBMP::LLImageBMP()
:
LLImageFormatted(IMG_CODEC_BMP),
mColorPaletteColors( 0 ),
mColorPalette( NULL ),
mColorPalette(nullptr ),
mBitmapOffset( 0 ),
mBitsPerPixel( 0 ),
mOriginAtTop( FALSE )
@@ -324,10 +318,13 @@ BOOL LLImageBMP::updateData()
if( 0 != mColorPaletteColors )
{
mColorPalette = new U8[color_palette_size];
if (!mColorPalette)
try
{
LL_ERRS() << "Out of memory in LLImageBMP::updateData()" << LL_ENDL;
mColorPalette = new U8[color_palette_size];
}
catch (const std::bad_alloc& e)
{
LL_WARNS() << "Failed to allocate bmp color date with exception: " << e.what() << LL_ENDL;
return FALSE;
}
memcpy( mColorPalette, mdata + FILE_HEADER_SIZE + BITMAP_HEADER_SIZE + extension_size, color_palette_size ); /* Flawfinder: ignore */

View File

@@ -271,7 +271,7 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
S32 width = getWidth(), height = getHeight();
S32 ncomponents = getComponents();
U8* data = NULL;
U8* data = nullptr;
if (mDiscardLevel >= 0)
{
data = getData() + getMipOffset(mDiscardLevel);
@@ -332,7 +332,7 @@ BOOL LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_
break;
default:
LL_ERRS() << "LLImageDXT::encode: Unhandled channel number: " << ncomponents << LL_ENDL;
return 0;
return false;
}
S32 width = raw_image->getWidth();
@@ -371,7 +371,7 @@ BOOL LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_
header->maxwidth = width;
header->maxheight = height;
U8* prev_mipdata = 0;
U8* prev_mipdata = nullptr;
w = width, h = height;
for (S32 mip=0; mip<nmips; mip++)
{

View File

@@ -33,12 +33,7 @@
#include "lltimer.h"
//#include "llmemory.h"
const char* fallbackEngineInfoLLImageJ2CImpl()
{
static std::string version_string = std::string("OpenJPEG: ") + opj_version();
return version_string.c_str();
}
// Factory function: see declaration in llimagej2c.cpp
LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
{
return new LLImageJ2COJ();
@@ -50,6 +45,13 @@ void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl)
impl = NULL;
}
const char* fallbackEngineInfoLLImageJ2CImpl()
{
static std::string version_string = std::string("OpenJPEG: ")
+ opj_version();
return version_string.c_str();
}
// Return string from message, eliminating final \n if present
static std::string chomp(const char* msg)
{
@@ -108,22 +110,57 @@ LLImageJ2COJ::~LLImageJ2COJ()
BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
{
//
// FIXME: Get the comment field out of the texture
//
LLTimer decode_timer;
/* Extract metadata */
/* ---------------- */
U8* c_data = base.getData();
size_t c_size = base.getDataSize();
size_t position = 0;
while (position < 1024 && position < (c_size - 7)) // the comment field should be in the first 1024 bytes.
{
if (c_data[position] == 0xff && c_data[position + 1] == 0x64)
{
U8 high_byte = c_data[position + 2];
U8 low_byte = c_data[position + 3];
S32 c_length = (high_byte * 256) + low_byte; // This size also counts the markers, 00 01 and itself
if (c_length > 200) // sanity check
{
// While comments can be very long, anything longer then 200 is suspect.
break;
}
if (position + 2 + c_length > c_size)
{
// comment extends past end of data, corruption, or all data not retrived yet.
break;
}
// if the comment block does not end at the end of data, check to see if the next
// block starts with 0xFF
if (position + 2 + c_length < c_size && c_data[position + 2 + c_length] != 0xff)
{
// invalied comment block
break;
}
// extract the comment minus the markers, 00 01
raw_image.mComment.assign((char*)c_data + position + 6, c_length - 4);
break;
}
++position;
}
opj_dparameters_t parameters; /* decompression parameters */
opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL;
opj_event_mgr_t event_mgr = { }; /* event manager */
opj_image_t *image = nullptr;
opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
opj_cio_t *cio = NULL;
opj_dinfo_t* dinfo = nullptr; /* handle to a decompressor */
opj_cio_t *cio = nullptr;
/* configure the event callbacks (not required) */
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
event_mgr.error_handler = error_callback;
event_mgr.warning_handler = warning_callback;
event_mgr.info_handler = info_callback;
@@ -168,19 +205,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
opj_setup_decoder(dinfo, &parameters);
/* open a byte stream */
#if 0
std::vector<U8> data(base.getData(), base.getData()+base.getDataSize());
S32 size = data.size();
if (data[size-1] == 0xFF) {
data.push_back((U8)0xD9);
} else if (data[size-2] != 0xFF || data[size-1] != 0xD9) {
data.push_back((U8)0xFF);
data.push_back((U8)0xD9);
}
cio = opj_cio_open((opj_common_ptr)dinfo, &data[0], data.size());
#else
cio = opj_cio_open((opj_common_ptr)dinfo, base.getData(), base.getDataSize());
#endif
/* decode the stream and fill the image structure */
image = opj_decode(dinfo, cio);
@@ -199,20 +224,11 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
// dereference the array.
if(!image || !image->numcomps)
{
LL_WARNS("Texture") << "ERROR -> decodeImpl: failed to decode image!" << LL_ENDL;
LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image!" << LL_ENDL;
if (image)
{
opj_image_destroy(image);
}
#if 0
std::stringstream filename;
filename << "err" << (int)base.getRawDiscardLevel() << "_" << rand() << ".jp2";
FILE* file = fopen(filename.str().c_str(), "wb");
if (file) {
fwrite(base.getData(), base.getDataSize(), 1, file);
fclose(file);
}
#endif
base.decodeFailed();
return TRUE; // done
}
@@ -222,7 +238,6 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
{
if (image->comps[i].factor != base.getRawDiscardLevel())
{
LL_WARNS("Texture") << "Expected discard level not reached!" << LL_ENDL;
// if we didn't get the discard level we're expecting, fail
opj_image_destroy(image);
base.decodeFailed();
@@ -262,6 +277,13 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
S32 height = ceildivpow2(image->y1 - image->y0, f);
raw_image.resize(width, height, channels);
U8 *rawp = raw_image.getData();
if (!rawp)
{
opj_image_destroy(image);
base.setLastError("Memory error");
base.decodeFailed();
return true; // done
}
// first_channel is what channel to start copying from
// dest is what channel to copy to. first_channel comes from the
@@ -283,9 +305,11 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
}
else // Some rare OpenJPEG versions have this bug.
{
LL_WARNS("Texture") << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << LL_ENDL;
opj_image_destroy(image);
LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << LL_ENDL;
if (image)
{
opj_image_destroy(image);
}
base.decodeFailed();
return TRUE; // done
}
@@ -302,14 +326,13 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
{
const S32 MAX_COMPS = 5;
opj_cparameters_t parameters; /* compression parameters */
opj_event_mgr_t event_mgr; /* event manager */
opj_event_mgr_t event_mgr = { }; /* event manager */
/*
configure the event callbacks (not required)
setting of each callback is optional
*/
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
event_mgr.error_handler = error_callback;
event_mgr.warning_handler = warning_callback;
event_mgr.info_handler = info_callback;
@@ -354,7 +377,7 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
//
OPJ_COLOR_SPACE color_space = CLRSPC_SRGB;
opj_image_cmptparm_t cmptparm[MAX_COMPS];
opj_image_t * image = NULL;
opj_image_t * image = nullptr;
S32 numcomps = llmin((S32)raw_image.getComponents(), MAX_COMPS);
S32 width = raw_image.getWidth();
S32 height = raw_image.getHeight();
@@ -398,7 +421,7 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
/* ---------------------------- */
int codestream_length;
opj_cio_t *cio = NULL;
opj_cio_t *cio = nullptr;
/* get a J2K compressor handle */
opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);
@@ -411,14 +434,14 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
/* open a byte stream for writing */
/* allocate memory for all tiles */
cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
cio = opj_cio_open((opj_common_ptr)cinfo, nullptr, 0);
/* encode the image */
bool bSuccess = opj_encode(cinfo, cio, image, NULL);
bool bSuccess = opj_encode(cinfo, cio, image, nullptr);
if (!bSuccess)
{
opj_cio_close(cio);
LL_WARNS("Texture") << "Failed to encode image." << LL_ENDL;
LL_DEBUGS("Texture") << "Failed to encode image." << LL_ENDL;
return FALSE;
}
codestream_length = cio_tell(cio);
@@ -520,15 +543,14 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
// Do it the old and slow way, decode the image with openjpeg
opj_dparameters_t parameters; /* decompression parameters */
opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL;
opj_event_mgr_t event_mgr = { }; /* event manager */
opj_image_t *image = nullptr;
opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
opj_cio_t *cio = NULL;
opj_dinfo_t* dinfo = nullptr; /* handle to a decompressor */
opj_cio_t *cio = nullptr;
/* configure the event callbacks (not required) */
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
event_mgr.error_handler = error_callback;
event_mgr.warning_handler = warning_callback;
event_mgr.info_handler = info_callback;

View File

@@ -37,7 +37,6 @@ set(llmessage_SOURCE_FILES
llassetstorage.cpp
llavatarname.cpp
llavatarnamecache.cpp
llblowfishcipher.cpp
llbuffer.cpp
llbufferstream.cpp
llcachename.cpp
@@ -57,7 +56,6 @@ set(llmessage_SOURCE_FILES
lliopipe.cpp
lliosocket.cpp
llioutil.cpp
llmail.cpp
llmessagebuilder.cpp
llmessageconfig.cpp
llmessagelog.cpp
@@ -128,7 +126,6 @@ set(llmessage_HEADER_FILES
llassetstorage.h
llavatarname.h
llavatarnamecache.h
llblowfishcipher.h
llbuffer.h
llbufferstream.h
llcachename.h
@@ -156,7 +153,6 @@ set(llmessage_HEADER_FILES
lliosocket.h
llioutil.h
llloginflags.h
llmail.h
llmessagebuilder.h
llmessageconfig.h
llmessagelog.h

View File

@@ -543,10 +543,7 @@ extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
//----------------------------------------------------------------------------
// LL_WINDOWS
// windows gl headers depend on things like APIENTRY, so include windows.
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#include "llwin32headerslean.h"
//----------------------------------------------------------------------------
#include <GL/gl.h>

View File

@@ -57,7 +57,7 @@
static LLRegisterWidget<LLScrollListCtrl> r("scroll_list");
LLMenuGL* sScrollListMenus[1] = {}; // List menus that recur, such as general avatars or groups menus
std::vector<LLMenuGL*> LLScrollListCtrl::sMenus = {}; // List menus that recur, such as general avatars or groups menus
// local structures & classes.
struct SortScrollListItem
@@ -2576,7 +2576,7 @@ void LLScrollListCtrl::setScrollListParameters(LLXMLNodePtr node)
// 0 is menu_avs_list.xml, 1 will be for groups, 2 could be for lists of objects
S32 menu_num;
node->getAttributeS32("menu_num", menu_num);
mPopupMenu = sScrollListMenus[menu_num];
setContextMenu(menu_num);
}
else if (node->hasAttribute("menu_file"))
{

View File

@@ -250,6 +250,8 @@ public:
// support right-click context menus for avatar/group lists
void setContextMenu(LLMenuGL* menu) { mPopupMenu = menu; }
void setContextMenu(S32 index) { mPopupMenu = sMenus[index]; }
static void addCommonMenu(LLMenuGL* menu) { sMenus.push_back(menu); }
// Overridden from LLView
/*virtual*/ void draw();
@@ -456,6 +458,8 @@ private:
S32 mHighlightedItem;
class LLViewBorder* mBorder;
LLMenuGL *mPopupMenu;
static std::vector<LLMenuGL*> sMenus; // List menus that recur, such as general avatars or groups menus
LLView *mCommentTextView;

View File

@@ -28,9 +28,7 @@
#include "linden_common.h"
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#include "llwin32headerslean.h"
#include "llkeyboardwin32.h"

View File

@@ -422,6 +422,10 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
LL_INFOS() << "Desired FSAA Samples = " << mFSAASamples << LL_ENDL;
memset(mCurrentGammaRamp, 0, sizeof(mCurrentGammaRamp));
memset(mPrevGammaRamp, 0, sizeof(mPrevGammaRamp));
mCustomGammaSet = FALSE;
// Initialize the keyboard
gKeyboard = new LLKeyboardWin32();
gKeyboard->setCallbacks(callbacks);
@@ -3020,13 +3024,26 @@ F32 LLWindowWin32::getGamma()
BOOL LLWindowWin32::restoreGamma()
{
return SetDeviceGammaRamp(mhDC, mPrevGammaRamp);
if (mCustomGammaSet != FALSE)
{
mCustomGammaSet = FALSE;
return SetDeviceGammaRamp(mhDC, mPrevGammaRamp);
}
return TRUE;
}
BOOL LLWindowWin32::setGamma(const F32 gamma)
{
mCurrentGamma = gamma;
//Get the previous gamma ramp to restore later.
if (mCustomGammaSet == FALSE)
{
if (GetDeviceGammaRamp(mhDC, mPrevGammaRamp) == FALSE)
return FALSE;
mCustomGammaSet = TRUE;
}
LL_DEBUGS("Window") << "Setting gamma to " << gamma << LL_ENDL;
for ( int i = 0; i < 256; ++i )
@@ -3038,9 +3055,9 @@ BOOL LLWindowWin32::setGamma(const F32 gamma)
if ( value > 0xffff )
value = 0xffff;
mCurrentGammaRamp [ 0 * 256 + i ] =
mCurrentGammaRamp [ 1 * 256 + i ] =
mCurrentGammaRamp [ 2 * 256 + i ] = ( WORD )value;
mCurrentGammaRamp[0][i] =
mCurrentGammaRamp[1][i] =
mCurrentGammaRamp[2][i] = (WORD) value;
};
return SetDeviceGammaRamp ( mhDC, mCurrentGammaRamp );

View File

@@ -27,10 +27,7 @@
#ifndef LL_LLWINDOWWIN32_H
#define LL_LLWINDOWWIN32_H
// Limit Windows API to small and manageable set.
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#include "llwin32headerslean.h"
#include "llwindow.h"
#include "llwindowcallbacks.h"
@@ -192,8 +189,9 @@ protected:
F32 mCurrentGamma;
U32 mFSAASamples;
S32 mVsyncMode;
WORD mPrevGammaRamp[256*3];
WORD mCurrentGammaRamp[256*3];
WORD mPrevGammaRamp[3][256];
WORD mCurrentGammaRamp[3][256];
BOOL mCustomGammaSet;
LPWSTR mIconResource;
BOOL mMousePositionModified;

View File

@@ -1571,20 +1571,6 @@ if (WINDOWS)
EMBED_MANIFEST(${VIEWER_BINARY_NAME} 1)
# sets the 'working directory' for debugging from visual studio.
if (NOT UNATTENDED)
add_custom_command(
TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
ARGS
--solution
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
--workingdir
${VIEWER_BINARY_NAME}
"${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
)
endif (NOT UNATTENDED)
if (PACKAGE)
add_custom_command(

View File

@@ -35,8 +35,8 @@ U32 NACLAntiSpamRegistry::globalAmount;
U32 NACLAntiSpamRegistry::globalTime;
bool NACLAntiSpamRegistry::bGlobalQueue;
NACLAntiSpamQueue* NACLAntiSpamRegistry::queues[NACLAntiSpamRegistry::QUEUE_MAX] = {0};
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*> NACLAntiSpamRegistry::globalEntries;
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*>::iterator NACLAntiSpamRegistry::it2;
boost::unordered_map<std::string,NACLAntiSpamQueueEntry*> NACLAntiSpamRegistry::globalEntries;
boost::unordered_map<std::string,NACLAntiSpamQueueEntry*>::iterator NACLAntiSpamRegistry::it2;
// The following sounds will be ignored for purposes of spam protection. They have been gathered from wiki documentation of frequent official sounds.
const std::string COLLISION_SOUNDS[] ={"dce5fdd4-afe4-4ea1-822f-dd52cac46b08","51011582-fbca-4580-ae9e-1a5593f094ec","68d62208-e257-4d0c-bbe2-20c9ea9760bb","75872e8c-bc39-451b-9b0b-042d7ba36cba","6a45ba0b-5775-4ea8-8513-26008a17f873","992a6d1b-8c77-40e0-9495-4098ce539694","2de4da5a-faf8-46be-bac6-c4d74f1e5767","6e3fb0f7-6d9c-42ca-b86b-1122ff562d7d","14209133-4961-4acc-9649-53fc38ee1667","bc4a4348-cfcc-4e5e-908e-8a52a8915fe6","9e5c1297-6eed-40c0-825a-d9bcd86e3193","e534761c-1894-4b61-b20c-658a6fb68157","8761f73f-6cf9-4186-8aaa-0948ed002db1","874a26fd-142f-4173-8c5b-890cd846c74d","0e24a717-b97e-4b77-9c94-b59a5a88b2da","75cf3ade-9a5b-4c4d-bb35-f9799bda7fb2","153c8bf7-fb89-4d89-b263-47e58b1b4774","55c3e0ce-275a-46fa-82ff-e0465f5e8703","24babf58-7156-4841-9a3f-761bdbb8e237","aca261d8-e145-4610-9e20-9eff990f2c12","0642fba6-5dcf-4d62-8e7b-94dbb529d117","25a863e8-dc42-4e8a-a357-e76422ace9b5","9538f37c-456e-4047-81be-6435045608d4","8c0f84c3-9afd-4396-b5f5-9bca2c911c20","be582e5d-b123-41a2-a150-454c39e961c8","c70141d4-ba06-41ea-bcbc-35ea81cb8335","7d1826f4-24c4-4aac-8c2e-eff45df37783","063c97d3-033a-4e9b-98d8-05c8074922cb","00000000-0000-0000-0000-000000000120"};

View File

@@ -15,7 +15,7 @@
#ifndef NACLANTISPAM_H
#define NACLANTISPAM_H
#include <boost/tr1/unordered_map.hpp>
#include <boost/unordered/unordered_map.hpp>
#include "stdtypes.h"
#include "lluuid.h"
class NACLAntiSpamQueueEntry
@@ -51,8 +51,8 @@ protected:
void blockEntry(LLUUID& source);
int checkEntry(LLUUID& source, U32 multiplier);
private:
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*> entries;
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*>::iterator it;
boost::unordered_map<std::string,NACLAntiSpamQueueEntry*> entries;
boost::unordered_map<std::string,NACLAntiSpamQueueEntry*>::iterator it;
U32 queueAmount;
U32 queueTime;
};
@@ -92,8 +92,8 @@ public:
private:
static const char* getQueueName(U32 queue_id);
static NACLAntiSpamQueue* queues[QUEUE_MAX];
static std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*> globalEntries;
static std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*>::iterator it2;
static boost::unordered_map<std::string,NACLAntiSpamQueueEntry*> globalEntries;
static boost::unordered_map<std::string,NACLAntiSpamQueueEntry*>::iterator it2;
static U32 globalTime;
static U32 globalAmount;
static bool bGlobalQueue;

File diff suppressed because it is too large Load Diff

View File

@@ -1273,6 +1273,17 @@ Found in Advanced->Rendering->Info Displays</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ShowMutedText</key>
<map>
<key>Comment</key>
<string>Whether or not to show chat from muted people in local chat.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>OtherChatsTornOff</key>
<map>
<key>Comment</key>
@@ -9163,6 +9174,50 @@ This should be as low as possible, but too low may break functionality</string>
<integer>128</integer>
</array>
</map>
<key>ImporterDebug</key>
<map>
<key>Comment</key>
<string>Enable debug output to more precisely identify sources of import errors. Warning: the output can slow down import on many machines.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ImporterLegacyMatching</key>
<map>
<key>Comment</key>
<string>Enable index based model matching.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ImporterModelLimit</key>
<map>
<key>Comment</key>
<string>Limits amount of importer generated models for dae files</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>768</integer>
</map>
<key>ImporterPreprocessDAE</key>
<map>
<key>Comment</key>
<string>Enable preprocessing for DAE files to fix some ColladaDOM related problems (like support for space characters within names and ids).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>IMInChatConsole</key>
<map>
<key>Comment</key>

View File

@@ -23,7 +23,7 @@
#ifdef near
#undef near
#endif
#include <hunspell/hunspelldll.h>
#include <hunspell/hunspell.hxx>
#pragma pop_macro("near")
#else
#include <hunspell/hunspell.hxx>

View File

@@ -315,7 +315,8 @@ namespace
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
LLFloaterAvatarList::instance().onClickFocus();
const LLUUID get_focused_list_id_selected();
LLFloaterAvatarList::instance().setFocusAvatar(get_focused_list_id_selected());
return true;
}
};

View File

@@ -688,7 +688,7 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
case LLAssetType::AT_OBJECT:
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:
if (!get_is_item_worn(item->getUUID()))
//if (!get_is_item_worn(item->getUUID())) // </edit>
return true;
break;
default:

View File

@@ -33,8 +33,10 @@
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llspeakers.h"
#include "lluictrlfactory.h" // Edit: For menu duality
#include "llviewermenu.h" // Edit: For menu duality
#include "llviewerwindow.h"
#include "llvoiceclient.h"
#include "llvoicechannel.h" // Edit: For menu duality
#include "llworld.h" // Edit: For ghost detection
// [RLVa:KB]
#include "rlvhandler.h"
@@ -70,6 +72,16 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,
//mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
}
void LLParticipantList::setupContextMenu()
{
if (mSpeakerMgr->getVoiceChannel() == LLVoiceChannelProximal::getInstance())
{
static LLMenuGL* menu = LLUICtrlFactory::getInstance()->buildMenu("menu_local_avs.xml", gMenuHolder);
mAvatarList->setContextMenu(menu);
}
else mAvatarList->setContextMenu(0);
}
BOOL LLParticipantList::postBuild()
{
mAvatarList = getChild<LLScrollListCtrl>("speakers_list");
@@ -97,6 +109,7 @@ BOOL LLParticipantList::postBuild()
// update speaker UI
handleSpeakerSelect();
setupContextMenu();
return true;
}
@@ -387,6 +400,7 @@ bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event,
bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
mAvatarList->clearRows();
setupContextMenu();
return true;
}

View File

@@ -203,6 +203,7 @@ protected:
private:
void onAvatarListDoubleClicked();
void setupContextMenu();
/**
* Adjusts passed participant to work properly.

View File

@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llavataractions.h"
#include "llavatarnamecache.h"
#include "llbutton.h"
#include "llcombobox.h"
#include "statemachine/aifilepicker.h"
@@ -229,25 +230,17 @@ void LLPreviewTexture::init()
childSetText("desc", item->getDescription());
getChild<LLLineEditor>("desc")->setPrevalidate(&LLLineEditor::prevalidatePrintableNotPipe);
childSetText("uuid", getItemID().asString());
childSetText("uploader", getItemCreatorName());
childSetText("uploadtime", getItemCreationDate());
childSetText("alphanote", LLTrans::getString("LoadingData"));
}
}
childSetText("uploader", getItemCreatorName());
childSetText("uploadtime", getItemCreationDate());
childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
combo->setCurrentByIndex(0);
}
void LLPreviewTexture::callbackLoadAvatarName(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
{
if (!sInstance) return;
std::ostringstream fullname;
fullname << first << " " << last;
sInstance->childSetText("uploader", fullname.str());
}
void LLPreviewTexture::draw()
{
if (mUpdateDimensions)
@@ -486,17 +479,20 @@ std::string LLPreviewTexture::getItemCreationDate()
timeToFormattedString(item->getCreationDate(), gSavedSettings.getString("TimestampFormat"), time);
return time;
}
return getString("Unknown");
const LLDate date = mImage->getUploadTime();
return date.notNull() ? date.toHTTPDateString(gSavedSettings.getString("TimestampFormat"))
: getString("Unknown");
}
std::string LLPreviewTexture::getItemCreatorName()
{
const LLViewerInventoryItem* item = getItem();
if(item)
const LLUUID& id = item ? item->getCreatorUUID() : mImage->getUploader();
if (id.notNull())
{
std::string name;
gCacheName->getFullName(item->getCreatorUUID(), name);
mCreatorKey = item->getCreatorUUID();
LLAvatarNameCache::getNSName(id, name);
mCreatorKey = id;
return name;
}
return getString("Unknown");
@@ -577,6 +573,14 @@ void LLPreviewTexture::updateDimensions()
}
// Update the width/height display every time
if (mImage->getUploader().notNull())
{
// Singu Note: This is what Alchemy does, we may need it, but it might help if it didn't load in init.
childSetText("uploader", getItemCreatorName());
childSetText("uploadtime", getItemCreationDate());
}
if (!mUserResized)
{
// clamp texture size to fit within actual size of floater after attempting resize

View File

@@ -104,7 +104,6 @@ private:
static LLPreviewTexture* sInstance;
static void onClickProfile(void* userdata);
static void callbackLoadAvatarName(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
// This is stored off in a member variable, because the save-as
// button and drag and drop functionality need to know.

View File

@@ -1021,10 +1021,11 @@ LLActiveSpeakerMgr::LLActiveSpeakerMgr() : LLSpeakerMgr(NULL)
void LLActiveSpeakerMgr::updateSpeakerList()
{
// point to whatever the current voice channel is
const auto old_channel = mVoiceChannel;
mVoiceChannel = LLVoiceChannel::getCurrentVoiceChannel();
// always populate from active voice channel
if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel) //MA: seems this is always false
if (mVoiceChannel != old_channel) //Singu Note: Don't let this always be false.
{
LL_DEBUGS("Speakers") << "Removed all speakers" << LL_ENDL;
fireEvent(new LLSpeakerListChangeEvent(this, LLUUID::null), "clear");

View File

@@ -2450,11 +2450,13 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject(
return ACCEPT_NO;
}
LLVOAvatarSelf* avatar = gAgentAvatarp;
/* <edit>
if(avatar && avatar->isWearingAttachment( item->getUUID() ) )
{
// You can't give objects that are attached to you
return ACCEPT_NO;
}
</edit> */
if( obj && avatar )
{
if(drop)

View File

@@ -192,7 +192,6 @@ extern BOOL gDebugTextEditorTips;
extern BOOL gShowOverlayTitle;
extern BOOL gOcclusionCull;
extern AIHTTPView* gHttpView;
extern LLMenuGL* sScrollListMenus[1];
//
// Globals
//
@@ -730,8 +729,8 @@ void init_menus()
gMenuHolder->addChild(gLoginMenuBarView);
// Singu Note: Initialize common ScrollListMenus here
sScrollListMenus[0] = LLUICtrlFactory::getInstance()->buildMenu("menu_avs_list.xml", gMenuHolder);
//sScrollListMenus[1] = LLUICtrlFactory::getInstance()->buildMenu("menu_groups_list.xml"); // Singu TODO
LLScrollListCtrl::addCommonMenu(LLUICtrlFactory::getInstance()->buildMenu("menu_avs_list.xml", gMenuHolder)); // 0
//LLScrollListCtrl::addCommonMenu(LLUICtrlFactory::getInstance()->buildMenu("menu_groups_list.xml")); // 1 // Singu TODO
LLView* ins = gMenuBarView->getChildView("insert_world", true, false);
ins->setVisible(false);
@@ -1689,6 +1688,8 @@ class LLAdvancedToggleWireframe : public view_listener_t
// [/RLVa:KB]
// gUseWireframe = !(gUseWireframe);
// gWindowResized = TRUE; // Singu Note: We don't use this (yet?)
LLPipeline::updateRenderDeferred();
gPipeline.resetVertexBuffers();
// return true;
}

View File

@@ -41,16 +41,7 @@
#include "linden_common.h"
// We may want to take the windows.h include out, but it used to be in
// linden_common.h, and hence in all the libraries. This is better. JC
#if LL_WINDOWS
// Limit Windows API to small and manageable set.
// If you get undefined symbols, find the appropriate
// Windows header file and include that in your .cpp file.
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#endif
#include "llwin32headerslean.h"
#include <algorithm>
#include <deque>

File diff suppressed because it is too large Load Diff

View File

@@ -413,6 +413,10 @@ public:
void forceRefetch();
/*virtual*/bool isActiveFetching(); //is actively in fetching by the fetching pipeline.
LLUUID getUploader();
LLDate getUploadTime();
std::string getComment();
protected:
/*virtual*/ void switchToCachedImage();
S32 getCurrentDiscardLevelForFetching() ;
@@ -510,6 +514,8 @@ protected:
BOOL mForSculpt ; //a flag if the texture is used as sculpt data.
BOOL mIsFetched ; //is loaded from remote or from cache, not generated locally.
std::map<S8, std::string> mComment;
public:
static LLPointer<LLViewerFetchedTexture> sMissingAssetImagep; // Texture to show for an image asset that is not in the database

View File

@@ -35,21 +35,6 @@
extern AIHTTPTimeoutPolicy voiceCallCapResponder_timeout;
LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap;
LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap;
LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL;
LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL;
LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChangedSignal;
BOOL LLVoiceChannel::sSuspended = FALSE;
//
// Constants
//
const U32 DEFAULT_RETRIES_COUNT = 3;
class LLVoiceCallCapResponder : public LLHTTPClient::ResponderWithResult
{
public:
@@ -66,59 +51,29 @@ private:
};
void LLVoiceCallCapResponder::httpFailure(void)
{
LL_WARNS("Voice") << "LLVoiceCallCapResponder error [status:"
<< mStatus << "]: " << mReason << LL_ENDL;
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID);
if ( channelp )
{
if ( 403 == mStatus )
{
//403 == no ability
LLNotificationsUtil::add(
"VoiceNotAllowed",
channelp->getNotifyArgs());
}
else
{
LLNotificationsUtil::add(
"VoiceCallGenericError",
channelp->getNotifyArgs());
}
channelp->deactivate();
}
}
LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap;
LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap;
LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = nullptr;
LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = nullptr;
LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChangedSignal;
void LLVoiceCallCapResponder::httpSuccess(void)
{
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID);
if (channelp)
{
// *TODO: DEBUG SPAM
LLSD::map_const_iterator iter;
for(iter = mContent.beginMap(); iter != mContent.endMap(); ++iter)
{
LL_DEBUGS("Voice") << "LLVoiceCallCapResponder::result got "
<< iter->first << LL_ENDL;
}
BOOL LLVoiceChannel::sSuspended = FALSE;
channelp->setChannelInfo(
mContent["voice_credentials"]["channel_uri"].asString(),
mContent["voice_credentials"]["channel_credentials"].asString());
}
}
//
// Constants
//
const U32 DEFAULT_RETRIES_COUNT = 3;
//
// LLVoiceChannel
//
LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& session_name) :
mCallDirection(OUTGOING_CALL),
mSessionID(session_id),
mState(STATE_NO_CHANNEL_INFO),
mSessionName(session_name),
mCallDirection(OUTGOING_CALL),
mIgnoreNextSessionLeave(FALSE),
mCallEndedByAgent(false)
mCallEndedByAgent(false),
mIgnoreNextSessionLeave(FALSE)
{
mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName;
@@ -203,19 +158,9 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
switch(type)
{
case STATUS_LOGIN_RETRY:
//mLoginNotificationHandle = LLNotifyBox::showXml("VoiceLoginRetry")->getHandle();
LLNotificationsUtil::add("VoiceLoginRetry");
// no user notice
break;
case STATUS_LOGGED_IN:
//if (!mLoginNotificationHandle.isDead())
//{
// LLNotifyBox* notifyp = (LLNotifyBox*)mLoginNotificationHandle.get();
// if (notifyp)
// {
// notifyp->close();
// }
// mLoginNotificationHandle.markDead();
//}
break;
case STATUS_LEFT_CHANNEL:
if (callStarted() && !mIgnoreNextSessionLeave && !sSuspended)
@@ -276,11 +221,11 @@ void LLVoiceChannel::deactivate()
//Default mic is OFF when leaving voice calls
if (gSavedSettings.getBOOL("AutoDisengageMic") &&
sCurrentVoiceChannel == this &&
LLVoiceClient::getInstance()->getUserPTTState())
sCurrentVoiceChannel == this /*&&
LLVoiceClient::getInstance()->getUserPTTState()*/) // Singu Note: This could be false, but we still need to do this.
{
gSavedSettings.setBOOL("PTTCurrentlyEnabled", true);
LLVoiceClient::getInstance()->inputUserControlState(true);
LLVoiceClient::getInstance()->setUserPTTState(false);
}
}
LLVoiceClient::getInstance()->removeObserver(this);
@@ -346,7 +291,7 @@ LLVoiceChannel* LLVoiceChannel::getChannelByID(const LLUUID& session_id)
voice_channel_map_t::iterator found_it = sVoiceChannelMap.find(session_id);
if (found_it == sVoiceChannelMap.end())
{
return NULL;
return nullptr;
}
else
{
@@ -360,7 +305,7 @@ LLVoiceChannel* LLVoiceChannel::getChannelByURI(std::string uri)
voice_channel_map_uri_t::iterator found_it = sVoiceChannelURIMap.find(uri);
if (found_it == sVoiceChannelURIMap.end())
{
return NULL;
return nullptr;
}
else
{
@@ -664,6 +609,50 @@ void LLVoiceChannelGroup::setState(EState state)
}
}
void LLVoiceCallCapResponder::httpFailure(void)
{
LL_WARNS("Voice") << "LLVoiceCallCapResponder error [status:"
<< mStatus << "]: " << mReason << LL_ENDL;
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID);
if ( channelp )
{
if ( 403 == mStatus )
{
//403 == no ability
LLNotificationsUtil::add(
"VoiceNotAllowed",
channelp->getNotifyArgs());
}
else
{
LLNotificationsUtil::add(
"VoiceCallGenericError",
channelp->getNotifyArgs());
}
channelp->deactivate();
}
}
void LLVoiceCallCapResponder::httpSuccess(void)
{
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID);
if (channelp)
{
// *TODO: DEBUG SPAM
LLSD::map_const_iterator iter;
for(iter = mContent.beginMap(); iter != mContent.endMap(); ++iter)
{
LL_DEBUGS("Voice") << "LLVoiceCallCapResponder::result got "
<< iter->first << LL_ENDL;
}
channelp->setChannelInfo(
mContent["voice_credentials"]["channel_uri"].asString(),
mContent["voice_credentials"]["channel_credentials"].asString());
}
}
//
// LLVoiceChannelProximal
//
@@ -723,6 +712,7 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status)
// do not notify user when leaving proximal channel
return;
case STATUS_VOICE_DISABLED:
LLVoiceClient::getInstance()->setUserPTTState(false);
//skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749)
if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking())
{
@@ -940,7 +930,7 @@ void LLVoiceChannelP2P::setState(EState state)
{
// you only "answer" voice invites in p2p mode
// so provide a special purpose message here
if (mReceivedCall && state == STATE_RINGING)
if (state == STATE_RINGING)
{
gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
doSetState(state);

View File

@@ -1,3 +1,5 @@
// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
/**
* @file llvoiceclient.cpp
* @brief Voice client delegation class implementation.
@@ -51,7 +53,7 @@ public:
// requests will be throttled from a non-trusted browser
LLVoiceHandler() : LLCommandHandler("voice", UNTRUSTED_THROTTLE) {}
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) override
{
if (params[0].asString() == "effects")
{
@@ -111,8 +113,8 @@ std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserv
LLVoiceClient::LLVoiceClient()
:
mVoiceModule(NULL),
m_servicePump(NULL),
mVoiceModule(nullptr),
m_servicePump(nullptr),
mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled", true)),
mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault", "00000000-0000-0000-0000-000000000000")),
mPTTDirty(true),
@@ -153,18 +155,17 @@ void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &age
}
else
{
mVoiceModule = NULL;
mVoiceModule = nullptr;
return;
}
mVoiceModule->init(m_servicePump);
mVoiceModule->userAuthorized(user_id, agentID);
}
void LLVoiceClient::terminate()
{
if (mVoiceModule) mVoiceModule->terminate();
mVoiceModule = NULL;
mVoiceModule = nullptr;
}
const LLVoiceVersionInfo LLVoiceClient::getVersion()
@@ -192,7 +193,10 @@ void LLVoiceClient::updateSettings()
updateMicMuteLogic();
if (mVoiceModule) mVoiceModule->updateSettings();
if (mVoiceModule)
{
mVoiceModule->updateSettings();
}
}
//--------------------------------------------------
@@ -394,24 +398,36 @@ void LLVoiceClient::setNonSpatialChannel(
const std::string &uri,
const std::string &credentials)
{
if (mVoiceModule) mVoiceModule->setNonSpatialChannel(uri, credentials);
if (mVoiceModule)
{
mVoiceModule->setNonSpatialChannel(uri, credentials);
}
}
void LLVoiceClient::setSpatialChannel(
const std::string &uri,
const std::string &credentials)
{
if (mVoiceModule) mVoiceModule->setSpatialChannel(uri, credentials);
if (mVoiceModule)
{
mVoiceModule->setSpatialChannel(uri, credentials);
}
}
void LLVoiceClient::leaveNonSpatialChannel()
{
if (mVoiceModule) mVoiceModule->leaveNonSpatialChannel();
if (mVoiceModule)
{
mVoiceModule->leaveNonSpatialChannel();
}
}
void LLVoiceClient::leaveChannel(void)
{
if (mVoiceModule) mVoiceModule->leaveChannel();
if (mVoiceModule)
{
mVoiceModule->leaveChannel();
}
}
std::string LLVoiceClient::getCurrentChannel()
@@ -497,7 +513,10 @@ bool LLVoiceClient::voiceEnabled()
void LLVoiceClient::setVoiceEnabled(bool enabled)
{
if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled);
if (mVoiceModule)
{
mVoiceModule->setVoiceEnabled(enabled);
}
}
void LLVoiceClient::updateMicMuteLogic()
@@ -637,31 +656,32 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)
return;
}
if(!mPTTIsMiddleMouse)
if(!mPTTIsMiddleMouse && mPTTKey != KEY_NONE)
{
bool down = (mPTTKey != KEY_NONE)
&& gKeyboard->getKeyDown(mPTTKey);
inputUserControlState(down);
bool down = gKeyboard->getKeyDown(mPTTKey);
if (down)
{
inputUserControlState(down);
}
}
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
if(!mPTTIsMiddleMouse)
if(!mPTTIsMiddleMouse && mPTTKey != KEY_NONE)
{
bool down = (mPTTKey != KEY_NONE)
&& gKeyboard->getKeyDown(mPTTKey);
inputUserControlState(down);
bool down = gKeyboard->getKeyDown(mPTTKey);
if (!down)
{
inputUserControlState(down);
}
}
}
void LLVoiceClient::middleMouseState(bool down)
{
if(mPTTIsMiddleMouse)
{
if(mPTTIsMiddleMouse)
{
inputUserControlState(down);
}
}
}
@@ -840,10 +860,11 @@ LLVoiceEffectInterface* LLVoiceClient::getVoiceEffectInterface() const
class LLViewerRequiredVoiceVersion : public LLHTTPNode
{
static BOOL sAlertedUser;
virtual void post(
void post(
LLHTTPNode::ResponsePtr response,
const LLSD& context,
const LLSD& input) const
const LLSD& input) const override
{
//You received this messsage (most likely on region cross or
//teleport)
@@ -870,10 +891,10 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode
class LLViewerParcelVoiceInfo : public LLHTTPNode
{
virtual void post(
void post(
LLHTTPNode::ResponsePtr response,
const LLSD& context,
const LLSD& input) const
const LLSD& input) const override
{
//the parcel you are in has changed something about its
//voice information

View File

@@ -49,14 +49,7 @@ LLVoiceRemoteCtrl::LLVoiceRemoteCtrl (const std::string& name) : LLPanel(name)
{
setIsChrome(TRUE);
if (gSavedSettings.getBOOL("ShowVoiceChannelPopup"))
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote_expanded.xml");
}
else
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote.xml");
}
LLUICtrlFactory::getInstance()->buildPanel(this, gSavedSettings.getBOOL("ShowVoiceChannelPopup") ? "panel_voice_remote_expanded.xml" : "panel_voice_remote.xml");
setFocusRoot(TRUE);
}
@@ -73,7 +66,6 @@ BOOL LLVoiceRemoteCtrl::postBuild()
mTalkBtn->setMouseUpCallback(boost::bind(&LLVoiceRemoteCtrl::onBtnTalkReleased));
mTalkLockBtn = getChild<LLButton>("ptt_lock");
mTalkLockBtn->setClickedCallback(boost::bind(&LLVoiceRemoteCtrl::onBtnLock,this));
mSpeakersBtn = getChild<LLButton>("speakers_btn");
mSpeakersBtn->setClickedCallback(boost::bind(&LLVoiceRemoteCtrl::onClickSpeakers));
@@ -92,12 +84,12 @@ BOOL LLVoiceRemoteCtrl::postBuild()
voice_channel_bg->setClickedCallback(boost::bind(&LLVoiceRemoteCtrl::onClickVoiceChannel));
mVoiceVolIcon.connect(this,"voice_volume");
mShowChanBtn.connect(this,"show_channel");
return TRUE;
}
void LLVoiceRemoteCtrl::draw()
{
// Singu TODO: I'm pretty sure voice channel changing can be done outside of draw call ~Liru
BOOL voice_active = FALSE;
LLVoiceChannel* channelp = LLVoiceChannel::getCurrentVoiceChannel();
if (channelp)
@@ -108,15 +100,13 @@ void LLVoiceRemoteCtrl::draw()
mTalkBtn->setEnabled(voice_active);
mTalkLockBtn->setEnabled(voice_active);
static LLCachedControl<bool> ptt_currently_enabled("PTTCurrentlyEnabled",false);
// propagate ptt state to button display,
if (!mTalkBtn->hasMouseCapture())
{
// not in push to talk mode, or push to talk is active means I'm talking
mTalkBtn->setToggleState(!ptt_currently_enabled || LLVoiceClient::getInstance()->getUserPTTState());
mTalkBtn->setToggleState(!mTalkLockBtn->getToggleState() || LLVoiceClient::getInstance()->getUserPTTState());
}
mSpeakersBtn->setToggleState(LLFloaterActiveSpeakers::instanceVisible(LLSD()));
mTalkLockBtn->setToggleState(!ptt_currently_enabled);
std::string talk_blip_image;
if (LLVoiceClient::getInstance()->getIsSpeaking(gAgent.getID()))
@@ -207,19 +197,6 @@ void LLVoiceRemoteCtrl::draw()
}
}
LLButton* expand_button = mShowChanBtn;
if (expand_button)
{
if (expand_button->getToggleState())
{
expand_button->setImageOverlay(std::string("arrow_down.tga"));
}
else
{
expand_button->setImageOverlay(std::string("arrow_up.tga"));
}
}
LLPanel::draw();
}
@@ -250,27 +227,13 @@ void LLVoiceRemoteCtrl::onBtnTalkReleased()
}
}
void LLVoiceRemoteCtrl::onBtnLock(void* user_data)
{
LLVoiceRemoteCtrl* remotep = (LLVoiceRemoteCtrl*)user_data;
gSavedSettings.setBOOL("PTTCurrentlyEnabled", !remotep->mTalkLockBtn->getToggleState());
}
//static
void LLVoiceRemoteCtrl::onClickPopupBtn(void* user_data)
{
LLVoiceRemoteCtrl* remotep = (LLVoiceRemoteCtrl*)user_data;
remotep->deleteAllChildren();
if (gSavedSettings.getBOOL("ShowVoiceChannelPopup"))
{
LLUICtrlFactory::getInstance()->buildPanel(remotep, "panel_voice_remote_expanded.xml");
}
else
{
LLUICtrlFactory::getInstance()->buildPanel(remotep, "panel_voice_remote.xml");
}
LLUICtrlFactory::getInstance()->buildPanel(remotep, gSavedSettings.getBOOL("ShowVoiceChannelPopup") ? "panel_voice_remote_expanded.xml" : "panel_voice_remote.xml");
gOverlayBar->layoutButtons();
}

View File

@@ -48,7 +48,6 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
static void onBtnLock(void* user_data);
static void onBtnTalkHeld();
static void onBtnTalkReleased();
static void onBtnTalkClicked();
@@ -62,7 +61,6 @@ protected:
LLButton* mTalkLockBtn;
LLButton* mSpeakersBtn;
CachedUICtrl<LLIconCtrl> mVoiceVolIcon;
CachedUICtrl<LLButton> mShowChanBtn;
};
#endif // LL_LLVOICEREMOTECTRL_H

View File

@@ -934,6 +934,23 @@ bool LLPipeline::isRenderDeferredDesired()
gSavedSettings.getBOOL("WindLightUseAtmosShaders");
}
//static
void LLPipeline::updateRenderDeferred()
{
bool deferred = (bool(LLRenderTarget::sUseFBO &&
LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
LLPipeline::sRenderBump &&
isRenderDeferredDesired())) &&
!gUseWireframe;
sRenderDeferred = deferred;
if (deferred)
{ //must render glow when rendering deferred since post effect pass is needed to present any lighting at all
sRenderGlow = true;
}
}
//static
void LLPipeline::refreshCachedSettings()
{

View File

@@ -408,6 +408,7 @@ public:
static bool isRenderDeferredCapable();
static bool isRenderDeferredDesired();
static void updateRenderDeferred();
static void refreshCachedSettings();
static void throttleNewMemoryAllocation(BOOL disable);

View File

@@ -15,7 +15,7 @@
<combo_box follows="left|top" height="18" label="Gestures" left="6" name="Gesture" width="120">
<combo_item name="Gestures">Gestures</combo_item>
</combo_box>
<check_box bottom_delta="-2" enabled="true" follows="left|top" font="SansSerifSmall" height="20" initial_value="false" label="Show Muted Text" left_delta="124" name="show mutes" width="116"/>
<check_box bottom_delta="-2" enabled="true" follows="left|top" font="SansSerifSmall" height="20" label="Show Muted Text" left_delta="124" name="show mutes" width="116" control_name="ShowMutedText"/>
<!--check_box bottom_delta="-15" enabled="true" follows="left|top" font="SansSerifSmall" height="20" initial_value="false" label="Translate Chat (powered by Google)" name="translate chat" width="100" control_name="TranslateChat"/-->
<button bottom_delta="2" left_delta="120" follows="left|top" font="SansSerifSmall" height="20" width="100" label="Open History" name="chat_history_open" tool_tip="Click here to open chat history in external editor."/>
<button bottom_delta="0" follows="right|top" height="20" label="&lt; &lt;" label_selected="&gt; &gt;" toggle="true" left="272" name="toggle_active_speakers_btn" right="305" tool_tip="Click here to show a list of active participants in this IM session." width="80"/>

View File

@@ -40,7 +40,7 @@
</menu_bar>
<text_editor type="string" length="1" bottom="-344" embedded_items="true" enabled="true"
follows="left|top|right|bottom" font="SansSerif" height="285"
ignore_tab="false" left="4" max_length="65536" mouse_opaque="true"
ignore_tab="false" left="4" max_length="2147483647" mouse_opaque="true"
name="Notecard Editor" width="392" word_wrap="true" spell_check="true">
Loading...
</text_editor>

View File

@@ -36,7 +36,7 @@
</menu_bar>
<text_editor type="string" length="1" bottom="-344" embedded_items="true" enabled="true"
follows="left|top|right|bottom" font="SansSerif" height="285"
ignore_tab="false" left="4" max_length="65536" mouse_opaque="true"
ignore_tab="false" left="4" max_length="2147483647" mouse_opaque="true"
name="Notecard Editor" width="392" word_wrap="true">
Loading...
</text_editor>

View File

@@ -4,7 +4,7 @@
<text_editor type="string" length="1" bottom="-393"
embedded_items="false" enabled="true" follows="left|top|right|bottom"
font="Monospace" height="376" ignore_tab="false" left="4"
max_length="65536" mouse_opaque="true" name="Script Editor" width="492" border_drop_shadow_visible="false" border_visible="false" bevel_style="none" border_style="line" border_thickness="0"
max_length="2147483647" mouse_opaque="true" name="Script Editor" width="492" border_drop_shadow_visible="false" border_visible="false" bevel_style="none" border_style="line" border_thickness="0"
word_wrap="true" show_line_numbers="true">
Loading...
</text_editor>

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Local Avs Menu" create_jump_keys="true">
<menu label="Avatar" name="Avatar" create_jump_keys="true">
<menu_item_call label="Profile" name="Profile">
<on_click function="List.ShowProfile"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Web Profile" name="Web Profile">
<on_click function="List.ShowWebProfile"/>
<on_visible function="List.VisibleWebProfile"/>
</menu_item_call>
<menu_item_call label="Pay" name="Pay">
<on_click function="List.Pay"/>
<on_enable function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Instant Message" name="Instant Message">
<on_click function="List.StartIM"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Conference Chat" name="Conference Chat">
<on_click function="List.StartConference"/>
<on_visible function="List.EnableMultipleSelected"/>
</menu_item_call>
<menu_item_call label="Call" name="Call">
<on_click function="List.StartCall"/>
<on_enable function="List.EnableCall"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Conference Call" name="Conference Call">
<on_click function="List.StartAdhocCall"/>
<on_enable function="List.EnableCall"/>
<on_visible function="List.EnableMultipleSelected"/>
</menu_item_call>
<menu_item_call label="Add Friend" name="Add Friend">
<on_click function="List.RequestFriendship"/>
<on_enable function="List.EnableSingleSelected"/>
<on_visible function="List.EnableIsNotFriend"/>
</menu_item_call>
<menu_item_call label="Remove Friend" name="Remove Friend">
<on_click function="List.RemoveFriend"/>
<on_enable function="List.EnableSingleSelected"/>
<on_visible function="List.EnableIsFriend"/>
</menu_item_call>
<menu_item_call label="Invite To Group" name="Invite To Group">
<on_click function="List.InviteToGroup"/>
<on_visible function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Offer Teleport" name="Offer Teleport">
<on_click function="List.OfferTeleport"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Teleport To" name="Teleport To" shortcut="control|Enter">
<on_click function="Radar.TeleportTo"/>
<on_enable function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Request Teleport" name="Request Teleport">
<on_click function="List.RequestTeleport"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Share" name="Share">
<on_click function="List.Share"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Chat History" name="Chat History">
<on_click function="List.ShowLog"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Track/Untrack" name="Track/Untrack">
<on_click function="Radar.Track"/>
<on_enable function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Copy Key" name="Copy Key">
<on_click function="List.CopyUUIDs"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Copy SLURL" name="Copy SLURL">
<on_click function="List.CopySLURL"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
</menu>
<menu_item_call label="Focus" name="Focus">
<on_click function="Radar.Focus"/>
<on_enable function="List.EnableSingleSelected"/>
</menu_item_call>
<menu label="Moderation" name="Moderation" create_jump_keys="true">
<menu_item_call label="Mute/Unmute" name="Mute/Unmute">
<on_click function="List.ToggleMute"/>
<on_enable function="List.EnableMute"/>
<on_visible function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Ban From Group" name="Ban From Group">
<on_click function="List.BanFromGroup"/>
<on_visible function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Report Abuse" name="Report Abuse">
<on_click function="List.AbuseReport"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_separator/>
<menu_item_call label="Freeze" name="Freeze">
<on_click function="List.Freeze"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Eject/Ban from Parcel" name="Eject/Ban from Parcel">
<on_click function="List.ParcelEject"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Eject from estate" name="Eject from estate">
<on_click function="List.EstateEject"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Eject and ban from estate" name="Eject and ban from estate">
<on_click function="List.EstateBan"/>
<on_enable function="List.EnableAnySelected"/>
</menu_item_call>
</menu>
</menu>

View File

@@ -9,7 +9,7 @@
</combo_box>
</layout_panel>
<layout_panel auto_resize="true" bottom="0" can_resize="false" height="120" min_height="100" name="moderate_chat_panel" top_delta="0" user_resize="false" visible="true" width="140">
<scroll_list bottom="78" can_resize="false" column_padding="0" draw_heading="true" draw_stripes="false" follows="left|top|bottom|right" left="0" multi_select="true" name="speakers_list" right="140" search_column="1" sort_column="2" top="113" menu_num="0">
<scroll_list bottom="78" can_resize="false" column_padding="0" draw_heading="true" draw_stripes="false" follows="left|top|bottom|right" left="0" multi_select="true" name="speakers_list" right="140" search_column="1" sort_column="2" top="113">
<column name="icon_speaking_status" sort="speaking_status" width="20"/>
<column dynamicwidth="true" label="Name" name="speaker_name"/>
<column label="" name="speaking_status" width="0"/>

View File

@@ -9,11 +9,12 @@
tab_stop="false" tool_tip="Hold the button to talk" width="60" />
<button bottom="-19" height="16" image_selected="ptt_lock_on.tga"
image_unselected="ptt_lock_off.tga" label="" left_delta="4" name="ptt_lock"
scale_image="false" toggle="true"
scale_image="false" toggle="true" control_name="PTTCurrentlyEnabled"
tool_tip="Click lock to switch to talk mode" width="16" />
<icon bottom="-19" height="16" image_name="icn_voice_ptt-off.tga" left_delta="42"
name="voice_volume" width="16" />
<button bottom="-22" control_name="ShowVoiceChannelPopup" height="22" label=""
left_delta="16" name="show_channel" scale_image="true" toggle="true"
image_selected="arrow_down.tga" image_unselected="arrow_up.tga"
tool_tip="Click to show current voice channel" width="22" />
</panel>

View File

@@ -334,15 +334,9 @@ class WindowsManifest(ViewerManifest):
self.path("vivoxsdk.dll")
self.path("ortp.dll")
self.path("libsndfile-1.dll")
self.path("zlib1.dll")
self.path("vivoxplatform.dll")
self.path("vivoxoal.dll")
self.path("ca-bundle.crt")
# Security
self.path("ssleay32.dll")
self.path("libeay32.dll")
# Hunspell
self.path("libhunspell.dll")
@@ -621,6 +615,10 @@ class Windows_i686_Manifest(WindowsManifest):
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
# Security
self.path("libcrypto-1_1.dll")
self.path("libssl-1_1.dll")
# Get fmod studio dll, continue if missing
try:
if self.args['configuration'].lower() == 'debug':
@@ -645,6 +643,10 @@ class Windows_x86_64_Manifest(WindowsManifest):
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
# Security
self.path("libcrypto-1_1-x64.dll")
self.path("libssl-1_1-x64.dll")
# Get fmodstudio dll, continue if missing
try:
if self.args['configuration'].lower() == 'debug':

View File

@@ -1,271 +0,0 @@
#region Using Directives
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Security.Permissions;
#endregion
namespace TestDispatchUtility
{
/// <summary>
/// Provides helper methods for working with COM IDispatch objects that have a registered type library.
/// </summary>
public static class DispatchUtility
{
#region Private Constants
private const int S_OK = 0; //From WinError.h
private const int LOCALE_SYSTEM_DEFAULT = 2 << 10; //From WinNT.h == 2048 == 0x800
#endregion
#region Public Methods
/// <summary>
/// Gets whether the specified object implements IDispatch.
/// </summary>
/// <param name="obj">An object to check.</param>
/// <returns>True if the object implements IDispatch. False otherwise.</returns>
public static bool ImplementsIDispatch(object obj)
{
bool result = obj is IDispatchInfo;
return result;
}
/// <summary>
/// Gets a Type that can be used with reflection.
/// </summary>
/// <param name="obj">An object that implements IDispatch.</param>
/// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
/// <returns>A .NET Type that can be used with reflection.</returns>
/// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static Type GetType(object obj, bool throwIfNotFound)
{
RequireReference(obj, "obj");
Type result = GetType((IDispatchInfo)obj, throwIfNotFound);
return result;
}
/// <summary>
/// Tries to get the DISPID for the requested member name.
/// </summary>
/// <param name="obj">An object that implements IDispatch.</param>
/// <param name="name">The name of a member to lookup.</param>
/// <param name="dispId">If the method returns true, this holds the DISPID on output.
/// If the method returns false, this value should be ignored.</param>
/// <returns>True if the member was found and resolved to a DISPID. False otherwise.</returns>
/// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static bool TryGetDispId(object obj, string name, out int dispId)
{
RequireReference(obj, "obj");
bool result = TryGetDispId((IDispatchInfo)obj, name, out dispId);
return result;
}
/// <summary>
/// Invokes a member by DISPID.
/// </summary>
/// <param name="obj">An object that implements IDispatch.</param>
/// <param name="dispId">The DISPID of a member. This can be obtained using
/// <see cref="TryGetDispId(object, string, out int)"/>.</param>
/// <param name="args">The arguments to pass to the member.</param>
/// <returns>The member's return value.</returns>
/// <remarks>
/// This can invoke a method or a property get accessor.
/// </remarks>
public static object Invoke(object obj, int dispId, object[] args)
{
string memberName = "[DispId=" + dispId + "]";
object result = Invoke(obj, memberName, args);
return result;
}
/// <summary>
/// Invokes a member by name.
/// </summary>
/// <param name="obj">An object.</param>
/// <param name="memberName">The name of the member to invoke.</param>
/// <param name="args">The arguments to pass to the member.</param>
/// <returns>The member's return value.</returns>
/// <remarks>
/// This can invoke a method or a property get accessor.
/// </remarks>
public static object Invoke(object obj, string memberName, object[] args)
{
RequireReference(obj, "obj");
Type type = obj.GetType();
object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty,
null, obj, args, null);
return result;
}
#endregion
#region Private Methods
/// <summary>
/// Requires that the value is non-null.
/// </summary>
/// <typeparam name="T">The type of the value.</typeparam>
/// <param name="value">The value to check.</param>
/// <param name="name">The name of the value.</param>
private static void RequireReference<T>(T value, string name) where T : class
{
if (value == null)
{
throw new ArgumentNullException(name);
}
}
/// <summary>
/// Gets a Type that can be used with reflection.
/// </summary>
/// <param name="dispatch">An object that implements IDispatch.</param>
/// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
/// <returns>A .NET Type that can be used with reflection.</returns>
private static Type GetType(IDispatchInfo dispatch, bool throwIfNotFound)
{
RequireReference(dispatch, "dispatch");
Type result = null;
int typeInfoCount;
int hr = dispatch.GetTypeInfoCount(out typeInfoCount);
if (hr == S_OK && typeInfoCount > 0)
{
// Type info isn't usually culture-aware for IDispatch, so we might as well pass
// the default locale instead of looking up the current thread's LCID each time
// (via CultureInfo.CurrentCulture.LCID).
dispatch.GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, out result);
}
if (result == null && throwIfNotFound)
{
// If the GetTypeInfoCount called failed, throw an exception for that.
Marshal.ThrowExceptionForHR(hr);
// Otherwise, throw the same exception that Type.GetType would throw.
throw new TypeLoadException();
}
return result;
}
/// <summary>
/// Tries to get the DISPID for the requested member name.
/// </summary>
/// <param name="dispatch">An object that implements IDispatch.</param>
/// <param name="name">The name of a member to lookup.</param>
/// <param name="dispId">If the method returns true, this holds the DISPID on output.
/// If the method returns false, this value should be ignored.</param>
/// <returns>True if the member was found and resolved to a DISPID. False otherwise.</returns>
private static bool TryGetDispId(IDispatchInfo dispatch, string name, out int dispId)
{
RequireReference(dispatch, "dispatch");
RequireReference(name, "name");
bool result = false;
// Members names aren't usually culture-aware for IDispatch, so we might as well
// pass the default locale instead of looking up the current thread's LCID each time
// (via CultureInfo.CurrentCulture.LCID).
Guid iidNull = Guid.Empty;
int hr = dispatch.GetDispId(ref iidNull, ref name, 1, LOCALE_SYSTEM_DEFAULT, out dispId);
const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); //From WinError.h
const int DISPID_UNKNOWN = -1; //From OAIdl.idl
if (hr == S_OK)
{
result = true;
}
else if (hr == DISP_E_UNKNOWNNAME && dispId == DISPID_UNKNOWN)
{
// This is the only supported "error" case because it means IDispatch
// is saying it doesn't know the member we asked about.
result = false;
}
else
{
// The other documented result codes are all errors.
Marshal.ThrowExceptionForHR(hr);
}
return result;
}
#endregion
#region Private Interfaces
/// <summary>
/// A partial declaration of IDispatch used to lookup Type information and DISPIDs.
/// </summary>
/// <remarks>
/// This interface only declares the first three methods of IDispatch. It omits the
/// fourth method (Invoke) because there are already plenty of ways to do dynamic
/// invocation in .NET. But the first three methods provide dynamic type metadata
/// discovery, which .NET doesn't provide normally if you have a System.__ComObject
/// RCW instead of a strongly-typed RCW.
/// <para/>
/// Note: The original declaration of IDispatch is in OAIdl.idl.
/// </remarks>
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00020400-0000-0000-C000-000000000046")]
private interface IDispatchInfo
{
/// <summary>
/// Gets the number of Types that the object provides (0 or 1).
/// </summary>
/// <param name="typeInfoCount">Returns 0 or 1 for the number of Types provided by <see cref="GetTypeInfo"/>.</param>
/// <remarks>
/// http://msdn.microsoft.com/en-us/library/da876d53-cb8a-465c-a43e-c0eb272e2a12(VS.85)
/// </remarks>
[PreserveSig]
int GetTypeInfoCount(out int typeInfoCount);
/// <summary>
/// Gets the Type information for an object if <see cref="GetTypeInfoCount"/> returned 1.
/// </summary>
/// <param name="typeInfoIndex">Must be 0.</param>
/// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
/// <param name="typeInfo">Returns the object's Type information.</param>
/// <remarks>
/// http://msdn.microsoft.com/en-us/library/cc1ec9aa-6c40-4e70-819c-a7c6dd6b8c99(VS.85)
/// </remarks>
void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler,
MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo);
/// <summary>
/// Gets the DISPID of the specified member name.
/// </summary>
/// <param name="riid">Must be IID_NULL. Pass a copy of Guid.Empty.</param>
/// <param name="name">The name of the member to look up.</param>
/// <param name="nameCount">Must be 1.</param>
/// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
/// <param name="dispId">If a member with the requested <paramref name="name"/>
/// is found, this returns its DISPID and the method's return value is 0.
/// If the method returns a non-zero value, then this parameter's output value is
/// undefined.</param>
/// <returns>Zero for success. Non-zero for failure.</returns>
/// <remarks>
/// http://msdn.microsoft.com/en-us/library/6f6cf233-3481-436e-8d6a-51f93bf91619(VS.85)
/// </remarks>
[PreserveSig]
int GetDispId(ref Guid riid, ref string name, int nameCount, int lcid, out int dispId);
// NOTE: The real IDispatch also has an Invoke method next, but we don't need it.
// We can invoke methods using .NET's Type.InvokeMember method with the special
// [DISPID=n] syntax for member "names", or we can get a .NET Type using GetTypeInfo
// and invoke methods on that through reflection.
// Type.InvokeMember: http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx
}
#endregion
}
}

View File

@@ -1,9 +0,0 @@
VSTool is a command line utility to manipulate VisualStudio settings.
The windows cmake project configuration uses VSTool.exe
A handy upgrade:
figure out how to make cmake build this csharp app
- or write the app using script (jscript?!?) so it doesn't need to be built.

View File

@@ -1,99 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<AssemblyName>VSTool</AssemblyName>
<AssemblyOriginatorKeyFile>
</AssemblyOriginatorKeyFile>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<DelaySign>false</DelaySign>
<OutputType>Exe</OutputType>
<RootNamespace>VSTool</RootNamespace>
<RunPostBuildEvent>Always</RunPostBuildEvent>
<StartupObject>VSTool.VSToolMain</StartupObject>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<OldToolsVersion>2.0</OldToolsVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>.\</OutputPath>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>true</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<NoStdLib>false</NoStdLib>
<NoWarn>
</NoWarn>
<Optimize>false</Optimize>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<DebugType>full</DebugType>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>.\</OutputPath>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>false</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<NoStdLib>false</NoStdLib>
<NoWarn>
</NoWarn>
<Optimize>true</Optimize>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<DebugType>none</DebugType>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="System">
<Name>System</Name>
</Reference>
<Reference Include="System.Data">
<Name>System.Data</Name>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="main.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

Binary file not shown.

View File

@@ -1,19 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -1,3 +0,0 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

View File

@@ -1,730 +0,0 @@
// Code about getting running instances visual studio
// was borrowed from
// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
namespace VSTool
{
// The MessageFilter class comes from:
// http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx
// It allows vstool to get timing error messages from
// visualstudio and handle them.
public class MessageFilter : IOleMessageFilter
{
//
// IOleMessageFilter functions.
// Handle incoming thread requests.
int IOleMessageFilter.HandleInComingCall(int dwCallType,
IntPtr hTaskCaller, int dwTickCount, IntPtr
lpInterfaceInfo)
{
//Return the flag SERVERCALL_ISHANDLED.
return 0;
}
// Thread call was rejected, so try again.
int IOleMessageFilter.RetryRejectedCall(IntPtr
hTaskCallee, int dwTickCount, int dwRejectType)
{
if (dwRejectType == 1 || dwRejectType == 2)
// flag = SERVERCALL_RETRYLATER or SERVERCALL_REJECTED.
{
// Retry the thread call immediately if return >=0 &
// <100.
return 99;
}
// Too busy; cancel call.
return -1;
}
int IOleMessageFilter.MessagePending(IntPtr hTaskCallee,
int dwTickCount, int dwPendingType)
{
//Return the flag PENDINGMSG_WAITDEFPROCESS.
return 2;
}
//
// Class containing the IOleMessageFilter
// thread error-handling functions.
// Start the filter.
public static void Register()
{
IOleMessageFilter newFilter = new MessageFilter();
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(newFilter, out oldFilter);
}
// Done with the filter, close it.
public static void Revoke()
{
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(null, out oldFilter);
}
// Implement the IOleMessageFilter interface.
[DllImport("Ole32.dll")]
private static extern int
CoRegisterMessageFilter(IOleMessageFilter newFilter, out
IOleMessageFilter oldFilter);
}
[ComImport, Guid("00000016-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IOleMessageFilter
{
[PreserveSig]
int HandleInComingCall(
int dwCallType,
IntPtr hTaskCaller,
int dwTickCount,
IntPtr lpInterfaceInfo);
[PreserveSig]
int RetryRejectedCall(
IntPtr hTaskCallee,
int dwTickCount,
int dwRejectType);
[PreserveSig]
int MessagePending(
IntPtr hTaskCallee,
int dwTickCount,
int dwPendingType);
}
internal class ViaCOM
{
public static object GetProperty(object from_obj, string prop_name)
{
try
{
var objType = from_obj.GetType();
return objType.InvokeMember(
prop_name,
BindingFlags.GetProperty, null,
from_obj,
null);
}
catch (Exception e)
{
Console.WriteLine("Error getting property: \"{0}\"", prop_name);
Console.WriteLine(e.Message);
throw e;
}
}
public static object SetProperty(object from_obj, string prop_name, object new_value)
{
try
{
object[] args = {new_value};
var objType = from_obj.GetType();
return objType.InvokeMember(
prop_name,
BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.SetProperty,
null,
from_obj,
args);
}
catch (Exception e)
{
Console.WriteLine("Error setting property: \"{0}\"", prop_name);
Console.WriteLine(e.Message);
throw e;
}
}
public static object CallMethod(object from_obj, string method_name, params object[] args)
{
try
{
var objType = from_obj.GetType();
return objType.InvokeMember(
method_name,
BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.InvokeMethod,
null,
from_obj,
args);
}
catch (Exception e)
{
Console.WriteLine("Error calling method \"{0}\"", method_name);
Console.WriteLine(e.Message);
throw e;
}
}
}
/// <summary>
/// The main entry point class for VSTool.
/// </summary>
internal class VSToolMain
{
private static readonly bool ignore_case = true;
private static string solution_name;
private static bool use_new_vs;
private static readonly Hashtable projectDict = new Hashtable();
private static string startup_project;
private static string config;
private static object dte;
private static object solution;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static int Main(string[] args)
{
var retVal = 0;
var need_save = false;
try
{
parse_command_line(args);
Console.WriteLine("Editing solution: {0}", solution_name);
var found_open_solution = GetDTEAndSolution();
if (dte == null || solution == null)
{
retVal = 1;
}
else
{
MessageFilter.Register();
// Walk through all of the projects in the solution
// and list the type of each project.
foreach (DictionaryEntry p in projectDict)
{
var project_name = (string) p.Key;
var working_dir = (string) p.Value;
if (SetProjectWorkingDir(solution, project_name, working_dir))
{
need_save = true;
}
}
if (config != null)
{
need_save = SetActiveConfig(config);
}
if (startup_project != null)
{
need_save = SetStartupProject(startup_project);
}
if (need_save)
{
if (found_open_solution == false)
{
ViaCOM.CallMethod(solution, "Close", null);
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
retVal = 1;
}
finally
{
if (solution != null)
{
Marshal.ReleaseComObject(solution);
solution = null;
}
if (dte != null)
{
Marshal.ReleaseComObject(dte);
dte = null;
}
MessageFilter.Revoke();
}
return retVal;
}
public static bool parse_command_line(string[] args)
{
var options_desc =
"--solution <solution_name> : MSVC solution name. (required)\n" +
"--use_new_vs : Ignore running versions of visual studio.\n" +
"--workingdir <project> <dir> : Set working dir of a VC project.\n" +
"--config <config> : Set the active config for the solution.\n" +
"--startup <project> : Set the startup project for the solution.\n";
try
{
// Command line param parsing loop.
var i = 0;
for (; i < args.Length; ++i)
{
if ("--solution" == args[i])
{
if (solution_name != null)
{
throw new ApplicationException("Found second --solution option");
}
solution_name = args[++i];
}
else if ("--use_new_vs" == args[i])
{
use_new_vs = true;
}
else if ("--workingdir" == args[i])
{
var project_name = args[++i];
var working_dir = args[++i];
projectDict.Add(project_name, working_dir);
}
else if ("--config" == args[i])
{
if (config != null)
{
throw new ApplicationException("Found second --config option");
}
config = args[++i];
}
else if ("--startup" == args[i])
{
if (startup_project != null)
{
throw new ApplicationException("Found second --startup option");
}
startup_project = args[++i];
}
else
{
throw new ApplicationException("Found unrecognized token on command line: " + args[i]);
}
}
if (solution_name == null)
{
throw new ApplicationException("The --solution option is required.");
}
}
catch (ApplicationException e)
{
Console.WriteLine("Oops! " + e.Message);
Console.Write("Command line:");
foreach (var arg in args)
{
Console.Write(" " + arg);
}
Console.Write("\n\n");
Console.WriteLine("VSTool command line usage");
Console.Write(options_desc);
throw e;
}
return true;
}
public static bool GetDTEAndSolution()
{
var found_open_solution = true;
Console.WriteLine("Looking for existing VisualStudio instance...");
// Get an instance of the currently running Visual Studio .NET IDE.
// dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1");
var full_solution_name = Path.GetFullPath(solution_name);
if (false == use_new_vs)
{
dte = GetIDEInstance(full_solution_name);
}
if (dte == null)
{
try
{
Console.WriteLine(" Didn't find open solution, starting new background VisualStudio instance...");
Console.WriteLine(" Reading .sln file version...");
var version = GetSolutionVersion(full_solution_name);
Console.WriteLine(" Using version: {0}...", version);
var progid = GetVSProgID(version);
var objType = Type.GetTypeFromProgID(progid);
dte = Activator.CreateInstance(objType);
Console.WriteLine(" Reading solution: \"{0}\"", full_solution_name);
solution = ViaCOM.GetProperty(dte, "Solution");
object[] openArgs = {full_solution_name};
ViaCOM.CallMethod(solution, "Open", openArgs);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Quitting do to error opening: {0}", full_solution_name);
solution = null;
dte = null;
return found_open_solution;
}
found_open_solution = false;
}
if (solution == null)
{
solution = ViaCOM.GetProperty(dte, "Solution");
}
return found_open_solution;
}
/// <summary>
/// Get the DTE object for the instance of Visual Studio IDE that has
/// the specified solution open.
/// </summary>
/// <param name="solutionFile">The absolute filename of the solution</param>
/// <returns>Corresponding DTE object or null if no such IDE is running</returns>
public static object GetIDEInstance(string solutionFile)
{
var runningInstances = GetIDEInstances(true);
var enumerator = runningInstances.GetEnumerator();
while (enumerator.MoveNext())
{
try
{
var ide = enumerator.Value;
if (ide != null)
{
var sol = ViaCOM.GetProperty(ide, "Solution");
if (0 == string.Compare((string) ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case))
{
return ide;
}
}
}
catch
{
// ignored
}
}
return null;
}
/// <summary>
/// Get a table of the currently running instances of the Visual Studio .NET IDE.
/// </summary>
/// <param name="openSolutionsOnly">Only return instances that have opened a solution</param>
/// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns>
public static Hashtable GetIDEInstances(bool openSolutionsOnly)
{
var runningIDEInstances = new Hashtable();
var runningObjects = GetRunningObjectTable();
var rotEnumerator = runningObjects.GetEnumerator();
while (rotEnumerator.MoveNext())
{
var candidateName = (string) rotEnumerator.Key;
if (!candidateName.StartsWith("!VisualStudio.DTE"))
continue;
var ide = rotEnumerator.Value;
if (ide == null)
continue;
if (openSolutionsOnly)
{
try
{
var sol = ViaCOM.GetProperty(ide, "Solution");
var solutionFile = (string) ViaCOM.GetProperty(sol, "FullName");
if (solutionFile != string.Empty)
{
runningIDEInstances[candidateName] = ide;
}
}
catch
{
// ignored
}
}
else
{
runningIDEInstances[candidateName] = ide;
}
}
return runningIDEInstances;
}
/// <summary>
/// Get a snapshot of the running object table (ROT).
/// </summary>
/// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns>
[STAThread]
public static Hashtable GetRunningObjectTable()
{
var result = new Hashtable();
var numFetched = 0;
IRunningObjectTable runningObjectTable;
IEnumMoniker monikerEnumerator;
var monikers = new IMoniker[1];
GetRunningObjectTable(0, out runningObjectTable);
runningObjectTable.EnumRunning(out monikerEnumerator);
monikerEnumerator.Reset();
while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0)
{
IBindCtx ctx;
CreateBindCtx(0, out ctx);
string runningObjectName;
monikers[0].GetDisplayName(ctx, null, out runningObjectName);
object runningObjectVal;
runningObjectTable.GetObject(monikers[0], out runningObjectVal);
result[runningObjectName] = runningObjectVal;
}
return result;
}
public static string GetSolutionVersion(string solutionFullFileName)
{
string version;
StreamReader solutionStreamReader = null;
try
{
solutionStreamReader = new StreamReader(solutionFullFileName);
string firstLine;
do
{
firstLine = solutionStreamReader.ReadLine();
} while (firstLine == "");
var format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim();
switch (format)
{
case "7.00":
version = "VC70";
break;
case "8.00":
version = "VC71";
break;
case "9.00":
version = "VC80";
break;
case "10.00":
version = "VC90";
break;
case "11.00":
version = "VC100";
break;
case "12.00":
version = "VC140";
break;
default:
throw new ApplicationException("Unknown .sln version: " + format);
}
}
finally
{
solutionStreamReader?.Close();
}
return version;
}
public static string GetVSProgID(string version)
{
string progid = null;
switch (version)
{
case "VC70":
progid = "VisualStudio.DTE.7";
break;
case "VC71":
progid = "VisualStudio.DTE.7.1";
break;
case "VC80":
progid = "VisualStudio.DTE.8.0";
break;
case "VC90":
progid = "VisualStudio.DTE.9.0";
break;
case "VC100":
progid = "VisualStudio.DTE.10.0";
break;
case "VC140":
progid = "VisualStudio.DTE.14.0";
break;
default:
throw new ApplicationException("Can't handle VS version: " + version);
}
return progid;
}
public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir)
{
var made_change = false;
Console.WriteLine("Looking for project {0}...", project_name);
try
{
var prjs = ViaCOM.GetProperty(sol, "Projects");
var count = ViaCOM.GetProperty(prjs, "Count");
for (var i = 1; i <= (int) count; ++i)
{
object[] prjItemArgs = {i};
var prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs);
var name = (string) ViaCOM.GetProperty(prj, "Name");
if (0 == string.Compare(name, project_name, ignore_case))
{
Console.WriteLine("Found project: {0}", project_name);
Console.WriteLine("Setting working directory");
var full_project_name = (string) ViaCOM.GetProperty(prj, "FullName");
Console.WriteLine(full_project_name);
// *NOTE:Mani Thanks to incompatibilities between different versions of the
// VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to
// the VCProjectEngine types from a different version than the one built
// with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built
// in VS 8.0. To avoid this problem, we can use the com object interfaces directly,
// without the type casting. Its tedious code, but it seems to work.
// oCfgs should be assigned to a 'Project.Configurations' collection.
var oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations");
// oCount will be assigned to the number of configs present in oCfgs.
var oCount = ViaCOM.GetProperty(oCfgs, "Count");
for (var cfgIndex = 1; cfgIndex <= (int) oCount; ++cfgIndex)
{
object[] itemArgs = {cfgIndex};
var oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs);
var oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings");
ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", working_dir);
}
break;
}
}
made_change = true;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Failed to set working dir for project, {0}.", project_name);
}
return made_change;
}
public static bool SetStartupProject(string startup_project)
{
var result = false;
try
{
// You need the 'unique name of the project to set StartupProjects.
// find the project by generic name.
Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project);
var prjs = ViaCOM.GetProperty(solution, "Projects");
var count = ViaCOM.GetProperty(prjs, "Count");
for (var i = 1; i <= (int) count; ++i)
{
object[] itemArgs = {i};
var prj = ViaCOM.CallMethod(prjs, "Item", itemArgs);
var prjName = ViaCOM.GetProperty(prj, "Name");
if (0 == string.Compare((string) prjName, startup_project, ignore_case))
{
var solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName"));
Console.WriteLine(" Success!");
result = true;
break;
}
}
if (result == false)
{
Console.WriteLine(" Could not find project \"{0}\" in the solution.", startup_project);
}
}
catch (Exception e)
{
Console.WriteLine(" Failed to set the startup project!");
Console.WriteLine(e.Message);
}
return result;
}
public static bool SetActiveConfig(string config)
{
var result = false;
try
{
Console.WriteLine("Trying to set active config to \"{0}\"", config);
var solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
var solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations");
object[] itemArgs = {config};
var solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs);
ViaCOM.CallMethod(solCfg, "Activate", null);
Console.WriteLine(" Success!");
result = true;
}
catch (Exception e)
{
Console.WriteLine(" Failed to set \"{0}\" as the active config.", config);
Console.WriteLine(e.Message);
}
return result;
}
#region Interop imports
[DllImport("ole32.dll")]
public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);
[DllImport("ole32.dll")]
public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);
#endregion
}
}