diff options
| author | Dessie Linden <dessie@lindenlab.com> | 2010-06-11 05:52:49 -0700 | 
|---|---|---|
| committer | Dessie Linden <dessie@lindenlab.com> | 2010-06-11 05:52:49 -0700 | 
| commit | 61d6669ffd766208abfa6240edc52723d8d141de (patch) | |
| tree | d0994dc489e8c365395da031d978a005f057a7e9 | |
| parent | 48809cb3a9350a0357a0fc710140e2437f3e068e (diff) | |
| parent | 085b2c24f9ded3d0e9a33500a287aaa53e8b7fba (diff) | |
Merge from 2.1 Alpha tag
24 files changed, 1464 insertions, 1073 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1ee7586d5f..035e9ddd9c 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -260,7 +260,6 @@ set(viewer_SOURCE_FILES      llinventoryfunctions.cpp      llinventoryicon.cpp      llinventoryitemslist.cpp -    llinventorylistitem.cpp      llinventorymodel.cpp      llinventorymodelbackgroundfetch.cpp      llinventoryobserver.cpp @@ -308,7 +307,6 @@ set(viewer_SOURCE_FILES      llnotificationstorage.cpp      llnotificationtiphandler.cpp      lloutfitslist.cpp -    lloutfitobserver.cpp      lloutputmonitorctrl.cpp      llpanelavatar.cpp      llpanelavatartag.cpp @@ -363,7 +361,6 @@ set(viewer_SOURCE_FILES      llpaneltopinfobar.cpp      llpanelvolume.cpp      llpanelvolumepulldown.cpp -    llpanelwearing.cpp      llparcelselection.cpp      llparticipantlist.cpp      llpatchvertexarray.cpp @@ -785,7 +782,6 @@ set(viewer_HEADER_FILES      llinventoryfunctions.h      llinventoryicon.h      llinventoryitemslist.h -    llinventorylistitem.h      llinventorymodel.h      llinventorymodelbackgroundfetch.h      llinventoryobserver.h @@ -829,9 +825,7 @@ set(viewer_HEADER_FILES      llnotificationmanager.h      llnotificationstorage.h      lloutfitslist.h -    lloutfitobserver.h      lloutputmonitorctrl.h -    llpanelappearancetab.h      llpanelavatar.h      llpanelavatartag.h      llpanelblockedlist.h @@ -885,7 +879,6 @@ set(viewer_HEADER_FILES      llpaneltopinfobar.h      llpanelvolume.h      llpanelvolumepulldown.h -    llpanelwearing.h      llparcelselection.h      llparticipantlist.h      llpatchvertexarray.h @@ -1077,6 +1070,7 @@ set(viewer_HEADER_FILES      llwearabletype.h      llweb.h      llwind.h +    llwindebug.h      llwlanimator.h      llwldaycycle.h      llwlparammanager.h @@ -1321,6 +1315,8 @@ set(viewer_APPSETTINGS_FILES      ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg      ) +use_prebuilt_binary(artwork-common) +  source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES})  set_source_files_properties(${viewer_APPSETTINGS_FILES} @@ -1704,35 +1700,12 @@ if (LINUX)    add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit) -  if (PACKAGE) +  if (NOT INSTALL)      add_custom_target(package ALL DEPENDS ${product}.tar.bz2)      add_dependencies(package linux-crash-logger-target)      add_dependencies(package linux-updater-target)      check_message_template(package) -  endif (PACKAGE) - -  add_custom_command( -    OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched -    COMMAND ${PYTHON_EXECUTABLE} -    ARGS -      ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py -      --arch=${ARCH} -      --actions=copy -      --artwork=${ARTWORK_DIR} -      --build=${CMAKE_CURRENT_BINARY_DIR} -      --buildtype=${CMAKE_BUILD_TYPE} -      --configuration=${CMAKE_CFG_INTDIR} -      --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged -      --grid=${GRID} -      --source=${CMAKE_CURRENT_SOURCE_DIR} -    DEPENDS  -      ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py -      ${COPY_INPUT_DEPENDENCIES} -    COMMENT "Performing viewer_manifest copy" -    ) -     -  add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)  -  add_dependencies(copy_l_viewer_manifest "${VIEWER_BINARY_NAME}" linux-crash-logger-target linux-updater-target) +  endif (NOT INSTALL)  endif (LINUX)  if (DARWIN) @@ -1767,30 +1740,52 @@ if (DARWIN)      DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py      ) -  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger) +  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit)    if (PACKAGE)        add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})         check_message_template(package) +      add_dependencies(package mac-updater mac-crash-logger)        add_custom_command(          TARGET package POST_BUILD          COMMAND ${PYTHON_EXECUTABLE}          ARGS            ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py -          --artwork=${ARTWORK_DIR} -          --build=${CMAKE_CURRENT_BINARY_DIR} +          --grid=${GRID}            --buildtype=${CMAKE_BUILD_TYPE} -          --channel=${VIEWER_CHANNEL}            --configuration=${CMAKE_CFG_INTDIR} +          --channel=${VIEWER_CHANNEL} +          --login_channel=${VIEWER_LOGIN_CHANNEL} +          --source=${CMAKE_CURRENT_SOURCE_DIR} +          --artwork=${ARTWORK_DIR} +          --build=${CMAKE_CURRENT_BINARY_DIR}            --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app +          --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched +        DEPENDS +          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py +      ) + + +      add_custom_command( +        TARGET package POST_BUILD +        COMMAND ${PYTHON_EXECUTABLE} +        ARGS +          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py            --grid=${GRID} +          --buildtype=${CMAKE_BUILD_TYPE} +          --configuration=${CMAKE_CFG_INTDIR} +          --channel=${VIEWER_CHANNEL}            --login_channel=${VIEWER_LOGIN_CHANNEL}            --source=${CMAKE_CURRENT_SOURCE_DIR} +          --artwork=${ARTWORK_DIR} +          --build=${CMAKE_CURRENT_BINARY_DIR} +          --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app            --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched          DEPENDS            ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py        ) +    endif (PACKAGE)  endif (DARWIN) @@ -1798,45 +1793,6 @@ if (INSTALL)    include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)  endif (INSTALL) -if (PACKAGE) -  if (WINDOWS) -    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") -    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2") -    set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") -    set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") -    set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) -  endif (WINDOWS) -  if (DARWIN) -    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app") -    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2") -    set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin") -    set(VIEWER_LIB_GLOB "*.dylib") -  endif (DARWIN) -  if (LINUX) -    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged") -    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2") -    set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") -    set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") -    set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) -  endif (LINUX) - -  add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" -    COMMAND "${PYTHON_EXECUTABLE}" -    ARGS -      "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" -      "${VIEWER_DIST_DIR}" -      "${VIEWER_EXE_GLOBS}" -      "${VIEWER_LIB_GLOB}" -      "${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/bin/dump_syms" -      "${VIEWER_SYMBOL_FILE}" -    DEPENDS generate_breakpad_symbols.py -    VERBATIM -  ) -  add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}") -  add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}") -  add_dependencies(package generate_breakpad_symbols) -endif (PACKAGE) -  if (LL_TESTS)    # To add a viewer unit test, just add the test .cpp file below    # This creates a separate test project per file listed. diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 810b2d9a1d..864a79c38a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,17 +1,6 @@  <?xml version="1.0" ?>  <llsd>  <map> -	<key>CrashHostUrl</key> -    <map> -      <key>Comment</key> -      <string>A URL pointing to a crash report handler; overrides cluster negotiation to locate crash handler.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string /> -    </map>      <key>AFKTimeout</key>      <map>        <key>Comment</key> @@ -585,7 +574,7 @@        <key>Value</key>        <integer>2</integer>      </map> -    <key>AvatarBakedTextureUploadTimeout</key> +    <key>AvatarBakedTextureTimeout</key>      <map>        <key>Comment</key>        <string>Specifes the maximum time in seconds to wait before sending your baked textures for avatar appearance.  Set to 0 to disable and wait until all baked textures are at highest resolution.</string> @@ -594,20 +583,8 @@        <key>Type</key>        <string>U32</string>        <key>Value</key> -      <integer>60</integer> -    </map> -    <key>AvatarBakedLocalTextureUpdateTimeout</key> -    <map> -      <key>Comment</key> -      <string>Specifes the maximum time in seconds to wait before updating your appearance during appearance mode.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>U32</string> -      <key>Value</key> -      <integer>10</integer> +      <integer>180</integer>      </map> -      <key>AvatarSex</key>      <map>        <key>Comment</key> @@ -2853,17 +2830,6 @@          <key>Value</key>          <integer>0</integer>      </map> -	<key>FeatureManagerHTTPTable</key> -      <map> -        <key>Comment</key> -        <string>Base directory for HTTP feature/gpu table fetches</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>String</string> -        <key>Value</key> -        <string>http://viewer-settings.secondlife.com</string> -    </map>      <key>FPSLogFrequency</key>      <map>        <key>Comment</key> @@ -3321,17 +3287,6 @@        <key>Value</key>        <real>1.0</real>      </map> -    <key>FlycamBuildModeScale</key> -    <map> -      <key>Comment</key> -      <string>Scale factor to apply to flycam movements when in build mode.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>F32</string> -      <key>Value</key> -      <real>1.0</real> -    </map>      <key>FlycamFeathering</key>      <map>        <key>Comment</key> @@ -3579,17 +3534,6 @@        <key>Value</key>        <real>9.0</real>      </map> -    <key>ForceAssetFail</key> -    <map> -      <key>Comment</key> -      <string>Force wearable fetches to fail for this asset type.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>U32</string> -      <key>Value</key> -      <integer>255</integer> -    </map>      <key>ForceShowGrid</key>      <map>        <key>Comment</key> @@ -3623,6 +3567,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>FullScreen</key> +    <map> +      <key>Comment</key> +      <string>Run SL in fullscreen mode</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FullScreenAspectRatio</key>      <map>        <key>Comment</key> @@ -3632,7 +3587,7 @@        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <real>3</real> +      <real>1.33329999447</real>      </map>      <key>FullScreenAutoDetectAspectRatio</key>      <map> @@ -3643,7 +3598,29 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer> +    </map> +    <key>FullScreenHeight</key> +    <map> +      <key>Comment</key> +      <string>Fullscreen resolution in height</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>768</integer> +    </map> +    <key>FullScreenWidth</key> +    <map> +      <key>Comment</key> +      <string>Fullscreen resolution in width</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1024</integer>      </map>      <key>GesturesMarketplaceURL</key>      <map> @@ -4678,382 +4655,8 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/</string> -    </map> -    <key>MarketplaceURL_objectFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Attachments Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string> -    </map> -    <key>MarketplaceURL_objectMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Attachments Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string> -    </map> -    <key>MarketplaceURL_clothingFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Clothing Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string> -    </map> -    <key>MarketplaceURL_clothingMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Clothing Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string> -    </map> -    <key>MarketplaceURL_bodypartFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Bodyparts Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com</string> -    </map> -    <key>MarketplaceURL_bodypartMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Bodyparts Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/</string> -    </map> -    <key>MarketplaceURL_glovesMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Gloves Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string> -    </map> -    <key>MarketplaceURL_glovesFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Gloves Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string> -    </map> -    <key>MarketplaceURL_jacketFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Jacket Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string> -    </map> -    <key>MarketplaceURL_jacketMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Jacket Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string> -    </map> -    <key>MarketplaceURL_shirtFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Shirt Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string> -    </map> -    <key>MarketplaceURL_shirtMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Shirt Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string> -    </map> -    <key>MarketplaceURL_undershirtFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Undershirt Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string> -    </map> -    <key>MarketplaceURL_undershirtMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Undershirt Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string> -    </map> -    <key>MarketplaceURL_skirtFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Skirt Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string> -    </map> -    <key>MarketplaceURL_skirtMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Skirt Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string> -    </map> -    <key>MarketplaceURL_pantsFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Pants Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_women</string> -    </map> -    <key>MarketplaceURL_pantsMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Pants Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_men</string> -    </map> -    <key>MarketplaceURL_underpantsFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Underwear Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string> -    </map> -    <key>MarketplaceURL_underpantsMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Underwear Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string> -    </map> -    <key>MarketplaceURL_shoesFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Shoes Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string> -    </map> -    <key>MarketplaceURL_shoesMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Shoes Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string> -    </map> -    <key>MarketplaceURL_socksFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Socks Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string> -    </map> -    <key>MarketplaceURL_socksMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Socks Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string> -    </map> -    <key>MarketplaceURL_tattooMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Tattoo Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string> -    </map> -    <key>MarketplaceURL_tattooFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Tattoo Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string> -    </map> -    <key>MarketplaceURL_hairFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Hair Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string> -    </map> -    <key>MarketplaceURL_hairMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Hair Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string> -    </map> -    <key>MarketplaceURL_eyesFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Eyes Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string> -    </map> -    <key>MarketplaceURL_eyesMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Eyes Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string> -    </map> -    <key>MarketplaceURL_shapeFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Shape Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string> -    </map> -    <key>MarketplaceURL_shapeMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Shape Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string> -    </map> -    <key>MarketplaceURL_skinFemale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Skin Female</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string> -    </map> -    <key>MarketplaceURL_skinMale</key> -    <map> -      <key>Comment</key> -      <string>URL to the Marketplace Skins Male</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string> -    </map> +      <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> +    </map>          <key>MaxDragDistance</key>      <map>        <key>Comment</key> @@ -5076,17 +4679,6 @@        <key>Value</key>        <real>64.0</real>      </map> -    <key>MaxWearableWaitTime</key> -    <map> -      <key>Comment</key> -      <string>Max seconds to wait for wearable assets to fetch.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>F32</string> -      <key>Value</key> -      <real>60.0</real> -    </map>      <key>MeanCollisionBump</key>      <map>        <key>Comment</key> @@ -5361,7 +4953,7 @@        <string>Boolean</string>        <key>Value</key>        <integer>0</integer> -    </map>  +    </map>      <key>MouseSun</key>      <map>        <key>Comment</key> @@ -5373,18 +4965,7 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>MultipleAttachments</key> -    <map> -      <key>Comment</key> -      <string>Allow multiple objects to be attached to a single attachment point.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -   <key>MuteAmbient</key> +    <key>MuteAmbient</key>      <map>        <key>Comment</key>        <string>Ambient sound effects, such as wind noise, play at 0 volume</string> @@ -6621,7 +6202,7 @@        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>12</integer> +      <integer>35</integer>      </map>      <key>RenderAvatarVP</key>      <map> @@ -8196,17 +7777,6 @@        <key>Value</key>        <integer>1</integer>      </map> -  <key>RenderUseStreamVBO</key> -  <map> -    <key>Comment</key> -    <string>Use VBO's for stream buffers</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>1</integer> -  </map>      <key>RenderVolumeLODFactor</key>      <map>        <key>Comment</key> @@ -10933,7 +10503,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>1</integer> +      <integer>0</integer>      </map>      <key>UseStartScreen</key>      <map> @@ -11416,9 +10986,9 @@        <key>Persist</key>        <integer>0</integer>        <key>Type</key> -      <string>S32</string> +      <string>Boolean</string>        <key>Value</key> -      <integer>-1</integer> +      <integer>0</integer>      </map>      <key>WaterEditPresets</key>      <map> @@ -11847,38 +11417,5 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>OutfitOperationsTimeout</key> -    <map> -      <key>Comment</key> -      <string>Timeout for outfit related operations.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>180</integer> -    </map> -    <key>HeightUnits</key> -    <map> -      <key>Comment</key> -      <string>Determines which metric units are used: 1(TRUE) for meter and 0(FALSE) for foot.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>TipToastMessageLineCount</key> -    <map> -      <key>Comment</key> -      <string>Max line count of text message on tip toast.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>10</integer> -    </map>  </map>  </llsd> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index dc76a4e518..d4000e9253 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -1,26 +1,26 @@  <llsd>      <map> -    <key>BusyResponseChanged</key> +    <key>BusyModeResponse</key>          <map>          <key>Comment</key> -            <string>Does user's busy mode message differ from default?</string> +            <string>Auto response to instant messages while in busy mode.</string>          <key>Persist</key>              <integer>1</integer>          <key>Type</key> -            <string>Boolean</string> +            <string>String</string>          <key>Value</key> -            <integer>0</integer> +            <string>The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.</string>          </map> -    <key>BusyModeResponse</key> +    <key>BusyModeResponse2</key>          <map>          <key>Comment</key> -            <string>Auto response to instant messages while in busy mode.</string> +            <string>Auto response to instant messages while in busy mode, clean (unencoded) version of BusyModeResponse</string>          <key>Persist</key>              <integer>1</integer>          <key>Type</key>              <string>String</string>          <key>Value</key> -            <string>The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.</string> +            <string>|TOKEN COPY BusyModeResponse|</string>          </map>      <key>InstantMessageLogPath</key>          <map> diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index f0e231e3d7..60a2392d87 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -3,25 +3,31 @@   * @author Mike Antipov   * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ @@ -443,7 +449,7 @@ void LLCallFloater::updateAgentModeratorState()  	if(gAgent.isInGroup(mSpeakerManager->getSessionID()))  	{  		// This method can be called when LLVoiceChannel.mState == STATE_NO_CHANNEL_INFO -		// in this case there are not any speakers yet. +		// in this case there are no any speakers yet.  		if (mSpeakerManager->findSpeaker(gAgentID))  		{  			// Agent is Moderator diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 881f777b48..e4341175e2 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -3,25 +3,31 @@   * @author Mike Antipov   * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp index 24d1707f64..ca1f142760 100644 --- a/indra/newview/llfloatervoiceeffect.cpp +++ b/indra/newview/llfloatervoiceeffect.cpp @@ -3,25 +3,31 @@   * @author Aimee   * @brief Selection and preview of voice effect.   * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * Copyright (c) 2002-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ @@ -193,12 +199,7 @@ void LLFloaterVoiceEffect::refreshEffectList()  			if(sl_item)  			{  				LLFontGL::StyleFlags style = is_template_only ? LLFontGL::NORMAL : LLFontGL::BOLD; -				LLScrollListText* slt = dynamic_cast<LLScrollListText*>(sl_item->getColumn(0)); -				llassert(slt); -				if (slt) -				{ -					slt->setFontStyle(style); -				} +				dynamic_cast<LLScrollListText*>(sl_item->getColumn(0))->setFontStyle(style);  			}  		}  	} diff --git a/indra/newview/llfloatervoiceeffect.h b/indra/newview/llfloatervoiceeffect.h index 4d432c46cc..fe207a05c3 100644 --- a/indra/newview/llfloatervoiceeffect.h +++ b/indra/newview/llfloatervoiceeffect.h @@ -3,25 +3,31 @@   * @author Aimee   * @brief Selection and preview of voice effects.   * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * Copyright (c) 2002-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp index 4bbfec8ab7..fd470798ee 100644 --- a/indra/newview/llpanelvoiceeffect.cpp +++ b/indra/newview/llpanelvoiceeffect.cpp @@ -3,25 +3,31 @@   * @author Aimee   * @brief Panel to select Voice Morphs.   * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ @@ -123,8 +129,6 @@ void LLPanelVoiceEffect::update(bool list_updated)  	if (mVoiceEffectCombo)  	{  		LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); -		llassert(effect_interface); -		if (!effect_interface) return;  		if (list_updated)  		{  			// Add the default "No Voice Morph" entry. diff --git a/indra/newview/llpanelvoiceeffect.h b/indra/newview/llpanelvoiceeffect.h index bba525e1df..b5bf2f05a8 100644 --- a/indra/newview/llpanelvoiceeffect.h +++ b/indra/newview/llpanelvoiceeffect.h @@ -3,25 +3,31 @@   * @author Aimee   * @brief Panel to select Voice Effects.   * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 49850748ee..a27afeab7c 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -2,25 +2,31 @@   * @file llparticipantlist.cpp   * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ @@ -46,18 +52,6 @@  static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR; -// helper function to update AvatarList Item's indicator in the voice participant list -static void update_speaker_indicator(const LLAvatarList* const avatar_list, const LLUUID& avatar_uuid, bool is_muted) -{ -	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid)); -	if (item) -	{ -		LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); -		indicator->setIsMuted(is_muted); -	} -} - -  // See EXT-4301.  /**   * class LLAvalineUpdater - observe the list of voice participants in session and check @@ -360,20 +354,6 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  				}  			}  		} - -		// update voice mute state of all items. See EXT-7235 -		LLSpeakerMgr::speaker_list_t speaker_list; - -		// Use also participants which are not in voice session now (the second arg is TRUE). -		// They can already have mModeratorMutedVoice set from the previous voice session -		// and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time. -		mSpeakerMgr->getSpeakerList(&speaker_list, TRUE); -		for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) -		{ -			const LLPointer<LLSpeaker>& speakerp = *it; - -			update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); -		}  	}  } @@ -526,7 +506,12 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event  	// update UI on confirmation of moderator mutes  	if (event->getValue().asString() == "voice")  	{ -		update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice); +		LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mAvatarList->getItemByValue(speakerp->mID)); +		if (item) +		{ +			LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); +			indicator->setIsMuted(speakerp->mModeratorMutedVoice); +		}  	}  	return true;  } @@ -576,7 +561,7 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)  	else  	{  		std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id); -		mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name); +		mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? display_name : LLTrans::getString("AvatarNameWaiting"));  		mAvalineUpdater->watchAvalineCaller(avatar_id);  	}  	adjustParticipant(avatar_id); diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index ede1d6bebe..ea7601517d 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -4,25 +4,31 @@   * @brief Implementation of SpeackerIndicatorManager class to process registered LLSpeackerIndicator   * depend on avatars are in the same voice channel.   * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 2cc8f233e4..efe59744bc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -2,25 +2,31 @@   * @file llviewerfloaterreg.cpp   * @brief LLViewerFloaterReg class registers floaters used in the viewer   * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2007&license=viewergpl$ + *  + * Copyright (c) 2007-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 9e3d61ae44..070663e22f 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -2,25 +2,31 @@   * @file llvoicechannel.cpp   * @brief Voice Channel related classes   * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index c8d338b0a3..074f9b8bba 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -2,25 +2,31 @@   * @file llvoicechannel.h   * @brief Voice channel related classes   * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 6c44f639ec..e8635d7f1a 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -2,25 +2,30 @@   * @file llvoiceclient.cpp   * @brief Voice client delegation class implementation.   * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */ diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 24d7d7163e..0e3d9a5435 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -2,25 +2,30 @@   * @file llvoiceclient.h   * @brief Declaration of LLVoiceClient class which is the interface to the voice client process.   * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */  #ifndef LL_VOICE_CLIENT_H diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index d6028b78cb..39649f0370 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -60,6 +60,7 @@  #include "llviewerparcelmgr.h"  //#include "llfirstuse.h"  #include "llspeakers.h" +#include "lltrans.h"  #include "llviewerwindow.h"  #include "llviewercamera.h" @@ -67,15 +68,11 @@  #include "llviewernetwork.h"  #include "llnotificationsutil.h" +#include "stringize.h" +  // for base64 decoding  #include "apr_base64.h" -// for SHA1 hash -#include "apr_sha1.h" - -// for MD5 hash -#include "llmd5.h" -  #define USE_SESSION_GROUPS 0  const F32 VOLUME_SCALE_VIVOX = 0.01f; @@ -100,14 +97,15 @@ const int MAX_LOGIN_RETRIES = 12;  // blocked is VERY rare and it's better to sacrifice response time in this situation for the sake of stability.  const int MAX_NORMAL_JOINING_SPATIAL_NUM = 50; +// How often to check for expired voice fonts in seconds +const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f; +// Time of day at which Vivox expires voice font subscriptions. +// Used to replace the time portion of received expiry timestamps. +static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z"; + +// Maximum length of capture buffer recordings in seconds. +const F32 CAPTURE_BUFFER_MAX_TIME = 10.f; -static void setUUIDFromStringHash(LLUUID &uuid, const std::string &str) -{ -	LLMD5 md5_uuid; -	md5_uuid.update((const unsigned char*)str.data(), str.size()); -	md5_uuid.finalize(); -	md5_uuid.raw_digest(uuid.mData); -}  static int scale_mic_volume(float volume)  { @@ -325,6 +323,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :  	mBuddyListMapPopulated(false),  	mBlockRulesListReceived(false),  	mAutoAcceptRulesListReceived(false), +  	mCaptureDeviceDirty(false),  	mRenderDeviceDirty(false),  	mSpatialCoordsDirty(false), @@ -348,10 +347,17 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :  	mVoiceEnabled(false),  	mWriteInProgress(false), -	mLipSyncEnabled(false) - +	mLipSyncEnabled(false), +	mVoiceFontsReceived(false), +	mVoiceFontsNew(false), +	mVoiceFontListDirty(false), +	mCaptureBufferMode(false), +	mCaptureBufferRecording(false), +	mCaptureBufferRecorded(false), +	mCaptureBufferPlaying(false), +	mPlayRequestCount(0)  {	  	mSpeakerVolume = scale_speaker_volume(0); @@ -654,6 +660,11 @@ std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)  		CASE(stateMicTuningStart);  		CASE(stateMicTuningRunning);  		CASE(stateMicTuningStop); +		CASE(stateCaptureBufferPaused); +		CASE(stateCaptureBufferRecStart); +		CASE(stateCaptureBufferRecording); +		CASE(stateCaptureBufferPlayStart); +		CASE(stateCaptureBufferPlaying);  		CASE(stateConnectorStart);  		CASE(stateConnectorStarting);  		CASE(stateConnectorStarted); @@ -662,6 +673,8 @@ std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)  		CASE(stateNeedsLogin);  		CASE(stateLoggingIn);  		CASE(stateLoggedIn); +		CASE(stateVoiceFontsWait); +		CASE(stateVoiceFontsReceived);  		CASE(stateCreatingSessionGroup);  		CASE(stateNoChannel);  		CASE(stateJoiningSession); @@ -775,8 +788,10 @@ void LLVivoxVoiceClient::stateMachine()  			// Clean up and reset everything.   			closeSocket();  			deleteAllSessions(); -			deleteAllBuddies();		 -			 +			deleteAllBuddies(); +			deleteAllVoiceFonts(); +			deleteVoiceFontTemplates(); +  			mConnectorHandle.clear();  			mAccountHandle.clear();  			mAccountPassword.clear(); @@ -1126,8 +1141,97 @@ void LLVivoxVoiceClient::stateMachine()  		}  		break; -												 -		//MARK: stateConnectorStart + +		//MARK: stateCaptureBufferPaused +		case stateCaptureBufferPaused: +			if (!mCaptureBufferMode) +			{ +				// Leaving capture mode. + +				mCaptureBufferRecording = false; +				mCaptureBufferRecorded = false; +				mCaptureBufferPlaying = false; + +				// Return to stateNoChannel to trigger reconnection to a channel. +				setState(stateNoChannel); +			} +			else if (mCaptureBufferRecording) +			{ +				setState(stateCaptureBufferRecStart); +			} +			else if (mCaptureBufferPlaying) +			{ +				setState(stateCaptureBufferPlayStart); +			} +		break; + +		//MARK: stateCaptureBufferRecStart +		case stateCaptureBufferRecStart: +			captureBufferRecordStartSendMessage(); + +			// Flag that something is recorded to allow playback. +			mCaptureBufferRecorded = true; + +			// Start the timer, recording will be stopped when it expires. +			mCaptureTimer.start(); +			mCaptureTimer.setTimerExpirySec(CAPTURE_BUFFER_MAX_TIME); + +			// Update UI, should really use a separate callback. +			notifyVoiceFontObservers(); + +			setState(stateCaptureBufferRecording); +		break; + +		//MARK: stateCaptureBufferRecording +		case stateCaptureBufferRecording: +			if (!mCaptureBufferMode || !mCaptureBufferRecording || +				mCaptureBufferPlaying || mCaptureTimer.hasExpired()) +			{ +				// Stop recording +				captureBufferRecordStopSendMessage(); +				mCaptureBufferRecording = false; + +				// Update UI, should really use a separate callback. +				notifyVoiceFontObservers(); + +				setState(stateCaptureBufferPaused); +			} +		break; + +		//MARK: stateCaptureBufferPlayStart +		case stateCaptureBufferPlayStart: +			captureBufferPlayStartSendMessage(mPreviewVoiceFont); + +			// Store the voice font being previewed, so that we know to restart if it changes. +			mPreviewVoiceFontLast = mPreviewVoiceFont; + +			// Update UI, should really use a separate callback. +			notifyVoiceFontObservers(); + +			setState(stateCaptureBufferPlaying); +		break; + +		//MARK: stateCaptureBufferPlaying +		case stateCaptureBufferPlaying: +			if (mCaptureBufferPlaying && mPreviewVoiceFont != mPreviewVoiceFontLast) +			{ +				// If the preview voice font changes, restart playing with the new font. +				setState(stateCaptureBufferPlayStart); +			} +			else if (!mCaptureBufferMode || !mCaptureBufferPlaying || mCaptureBufferRecording) +			{ +				// Stop playing. +				captureBufferPlayStopSendMessage(); +				mCaptureBufferPlaying = false; + +				// Update UI, should really use a separate callback. +				notifyVoiceFontObservers(); + +				setState(stateCaptureBufferPaused); +			} +		break; + +			//MARK: stateConnectorStart  		case stateConnectorStart:  			if(!mVoiceEnabled)  			{ @@ -1222,6 +1326,18 @@ void LLVivoxVoiceClient::stateMachine()  			notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGGED_IN); +			if (LLVoiceClient::instance().getVoiceEffectEnabled()) +			{ +				// Request the set of available voice fonts. +				setState(stateVoiceFontsWait); +				refreshVoiceEffectLists(true); +			} +			else +			{ +				// If voice effects are disabled, pretend we've received them and carry on. +				setState(stateVoiceFontsReceived); +			} +  			// request the current set of block rules (we'll need them when updating the friends list)  			accountListBlockRulesSendMessage(); @@ -1253,12 +1369,25 @@ void LLVivoxVoiceClient::stateMachine()  					writeString(stream.str());  				}  			} +		break; + +		//MARK: stateVoiceFontsWait +		case stateVoiceFontsWait:		// Await voice font list +			// accountGetSessionFontsResponse() will transition from here to +			// stateVoiceFontsReceived, to ensure we have the voice font list +			// before attempting to create a session. +		break; +		//MARK: stateVoiceFontsReceived +		case stateVoiceFontsReceived:	// Voice font list received +			// Set up the timer to check for expiring voice fonts +			mVoiceFontExpiryTimer.start(); +			mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL); +  #if USE_SESSION_GROUPS			  			// create the main session group -			sessionGroupCreateSendMessage(); -			  			setState(stateCreatingSessionGroup); +			sessionGroupCreateSendMessage();  #else  			// Not using session groups -- skip the stateCreatingSessionGroup state.  			setState(stateNoChannel); @@ -1306,6 +1435,10 @@ void LLVivoxVoiceClient::stateMachine()  				mTuningExitState = stateNoChannel;  				setState(stateMicTuningStart);  			} +			else if(mCaptureBufferMode) +			{ +				setState(stateCaptureBufferPaused); +			}  			else if(sessionNeedsRelog(mNextAudioSession))  			{  				requestRelog(); @@ -1316,6 +1449,7 @@ void LLVivoxVoiceClient::stateMachine()  				sessionState *oldSession = mAudioSession;  				mAudioSession = mNextAudioSession; +				mAudioSessionChanged = true;  				if(!mAudioSession->mReconnect)	  				{  					mNextAudioSession = NULL; @@ -1478,6 +1612,13 @@ void LLVivoxVoiceClient::stateMachine()  					enforceTether();  				} +				// Do notifications for expiring Voice Fonts. +				if (mVoiceFontExpiryTimer.hasExpired()) +				{ +					expireVoiceFonts(); +					mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL); +				} +  				// Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often  				// -- the user can only click so fast) or every 10hz, whichever is sooner.  				// Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged. @@ -1547,6 +1688,8 @@ void LLVivoxVoiceClient::stateMachine()  			mAccountHandle.clear();  			deleteAllSessions();  			deleteAllBuddies(); +			deleteAllVoiceFonts(); +			deleteVoiceFontTemplates();  			if(mVoiceEnabled && !mRelogRequested)  			{ @@ -1627,15 +1770,15 @@ void LLVivoxVoiceClient::stateMachine()  	} -	if(mAudioSession && mAudioSession->mParticipantsChanged) +	if (mAudioSessionChanged)  	{ -		mAudioSession->mParticipantsChanged = false; -		mAudioSessionChanged = true; +		mAudioSessionChanged = false; +		notifyParticipantObservers(); +		notifyVoiceFontObservers();  	} -	 -	if(mAudioSessionChanged) +	else if (mAudioSession && mAudioSession->mParticipantsChanged)  	{ -		mAudioSessionChanged = false; +		mAudioSession->mParticipantsChanged = false;  		notifyParticipantObservers();  	}  } @@ -1751,8 +1894,11 @@ void LLVivoxVoiceClient::sessionGroupCreateSendMessage()  void LLVivoxVoiceClient::sessionCreateSendMessage(sessionState *session, bool startAudio, bool startText)  { -	LL_DEBUGS("Voice") << "requesting create: " << session->mSIPURI << LL_ENDL; -	 +	LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL; + +	S32 font_index = getVoiceFontIndex(session->mVoiceFontID); +	LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; +  	session->mCreateInProgress = true;  	if(startAudio)  	{ @@ -1776,10 +1922,11 @@ void LLVivoxVoiceClient::sessionCreateSendMessage(sessionState *session, bool st  			<< "<Password>" << LLURI::escape(session->mHash, allowed_chars) << "</Password>"  			<< "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>";  	} -	 +  	stream  		<< "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"  		<< "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" +		<< "<VoiceFontID>" << font_index << "</VoiceFontID>"  		<< "<Name>" << mChannelName << "</Name>"  	<< "</Request>\n\n\n";  	writeString(stream.str()); @@ -1787,8 +1934,11 @@ void LLVivoxVoiceClient::sessionCreateSendMessage(sessionState *session, bool st  void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio, bool startText)  { -	LL_DEBUGS("Voice") << "requesting create: " << session->mSIPURI << LL_ENDL; -	 +	LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL; + +	S32 font_index = getVoiceFontIndex(session->mVoiceFontID); +	LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; +  	session->mCreateInProgress = true;  	if(startAudio)  	{ @@ -1814,6 +1964,7 @@ void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session  		<< "<Name>" << mChannelName << "</Name>"  		<< "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"  		<< "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" +		<< "<VoiceFontID>" << font_index << "</VoiceFontID>"  		<< "<Password>" << password << "</Password>"  		<< "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>"  	<< "</Request>\n\n\n" @@ -1824,7 +1975,10 @@ void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session  void LLVivoxVoiceClient::sessionMediaConnectSendMessage(sessionState *session)  { -	LL_DEBUGS("Voice") << "connecting audio to session handle: " << session->mHandle << LL_ENDL; +	LL_DEBUGS("Voice") << "Connecting audio to session handle: " << session->mHandle << LL_ENDL; + +	S32 font_index = getVoiceFontIndex(session->mVoiceFontID); +	LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL;  	session->mMediaConnectInProgress = true; @@ -1834,6 +1988,7 @@ void LLVivoxVoiceClient::sessionMediaConnectSendMessage(sessionState *session)  	<< "<Request requestId=\"" << session->mHandle << "\" action=\"Session.MediaConnect.1\">"  		<< "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"  		<< "<SessionHandle>" << session->mHandle << "</SessionHandle>" +		<< "<VoiceFontID>" << font_index << "</VoiceFontID>"  		<< "<Media>Audio</Media>"  	<< "</Request>\n\n\n"; @@ -3156,7 +3311,7 @@ void LLVivoxVoiceClient::sessionAddedEvent(  			else  			{  				LL_INFOS("Voice") << "Could not generate caller id from uri, using hash of uri " << session->mSIPURI << LL_ENDL; -				setUUIDFromStringHash(session->mCallerID, session->mSIPURI); +				session->mCallerID.generate(session->mSIPURI);  				session->mSynthesizedCallerID = true;  				// Can't look up the name in this case -- we have to extract it from the URI. @@ -3434,6 +3589,26 @@ void LLVivoxVoiceClient::accountLoginStateChangeEvent(  	}  } +void LLVivoxVoiceClient::mediaCompletionEvent(std::string &sessionGroupHandle, std::string &mediaCompletionType) +{ +	if (mediaCompletionType == "AuxBufferAudioCapture") +	{ +		mCaptureBufferRecording = false; +	} +	else if (mediaCompletionType == "AuxBufferAudioRender") +	{ +		// Ignore all but the last stop event +		if (--mPlayRequestCount <= 0) +		{ +			mCaptureBufferPlaying = false; +		} +	} +	else +	{ +		LL_DEBUGS("Voice") << "Unknown MediaCompletionType: " << mediaCompletionType << LL_ENDL; +	} +} +  void LLVivoxVoiceClient::mediaStreamUpdatedEvent(  	std::string &sessionHandle,   	std::string &sessionGroupHandle,  @@ -4142,8 +4317,8 @@ LLVivoxVoiceClient::participantState *LLVivoxVoiceClient::sessionState::addParti  			else  			{  				// Create a UUID by hashing the URI, but do NOT set mAvatarIDValid. -				// This tells code in LLVivoxVoiceClient that the ID will not be in the name cache. -				setUUIDFromStringHash(result->mAvatarID, uri); +				// This indicates that the ID will not be in the name cache. +				result->mAvatarID.generate(uri);  			}  		} @@ -4638,7 +4813,7 @@ BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id)  	return result;  } -bool LLVivoxVoiceClient::isVoiceWorking() +bool LLVivoxVoiceClient::isVoiceWorking() const  {    //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)    // Condition with joining spatial num was added to take into account possible problems with connection to voice @@ -5660,7 +5835,12 @@ LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::addSession(const std::stri  		result = new sessionState();  		result->mSIPURI = uri;  		result->mHandle = handle; -		 + +		if (LLVoiceClient::instance().getVoiceEffectEnabled()) +		{ +			result->mVoiceFontID = LLVoiceClient::instance().getVoiceEffectDefault(); +		} +  		mSessions.insert(result);  		if(!result->mHandle.empty()) @@ -6085,8 +6265,8 @@ void LLVivoxVoiceClient::notifyParticipantObservers()  		)  	{  		LLVoiceClientParticipantObserver* observer = *it; -		observer->onChange(); -		// In case onChange() deleted an entry. +		observer->onParticipantsChanged(); +		// In case onParticipantsChanged() deleted an entry.  		it = mParticipantObservers.upper_bound(observer);  	}  } @@ -6249,6 +6429,660 @@ void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string  	}  } +bool LLVivoxVoiceClient::setVoiceEffect(const LLUUID& id) +{ +	if (!mAudioSession) +	{ +		return false; +	} + +	if (!id.isNull()) +	{ +		if (mVoiceFontMap.empty()) +		{ +			LL_DEBUGS("Voice") << "Voice fonts not available." << LL_ENDL; +			return false; +		} +		else if (mVoiceFontMap.find(id) == mVoiceFontMap.end()) +		{ +			LL_DEBUGS("Voice") << "Invalid voice font " << id << LL_ENDL; +			return false; +		} +	} + +	// *TODO: Check for expired fonts? +	mAudioSession->mVoiceFontID = id; + +	// *TODO: Separate voice font defaults for spatial chat and IM? +	gSavedPerAccountSettings.setString("VoiceEffectDefault", id.asString()); + +	sessionSetVoiceFontSendMessage(mAudioSession); +	notifyVoiceFontObservers(); + +	return true; +} + +const LLUUID LLVivoxVoiceClient::getVoiceEffect() +{ +	return mAudioSession ? mAudioSession->mVoiceFontID : LLUUID::null; +} + +LLSD LLVivoxVoiceClient::getVoiceEffectProperties(const LLUUID& id) +{ +	LLSD sd; + +	voice_font_map_t::iterator iter = mVoiceFontMap.find(id); +	if (iter != mVoiceFontMap.end()) +	{ +		sd["template_only"] = false; +	} +	else +	{ +		// Voice effect is not in the voice font map, see if there is a template +		iter = mVoiceFontTemplateMap.find(id); +		if (iter == mVoiceFontTemplateMap.end()) +		{ +			LL_WARNS("Voice") << "Voice effect " << id << "not found." << LL_ENDL; +			return sd; +		} +		sd["template_only"] = true; +	} + +	voiceFontEntry *font = iter->second; +	sd["name"] = font->mName; +	sd["expiry_date"] = font->mExpirationDate; +	sd["is_new"] = font->mIsNew; + +	return sd; +} + +LLVivoxVoiceClient::voiceFontEntry::voiceFontEntry(LLUUID& id) : +	mID(id), +	mFontIndex(0), +	mFontType(VOICE_FONT_TYPE_NONE), +	mFontStatus(VOICE_FONT_STATUS_NONE), +	mIsNew(false) +{ +	mExpiryTimer.stop(); +	mExpiryWarningTimer.stop(); +} + +LLVivoxVoiceClient::voiceFontEntry::~voiceFontEntry() +{ +} + +void LLVivoxVoiceClient::refreshVoiceEffectLists(bool clear_lists) +{ +	if (clear_lists) +	{ +		mVoiceFontsReceived = false; +		deleteAllVoiceFonts(); +		deleteVoiceFontTemplates(); +	} + +	accountGetSessionFontsSendMessage(); +	accountGetTemplateFontsSendMessage(); +} + +const voice_effect_list_t& LLVivoxVoiceClient::getVoiceEffectList() const +{ +	return mVoiceFontList; +} + +const voice_effect_list_t& LLVivoxVoiceClient::getVoiceEffectTemplateList() const +{ +	return mVoiceFontTemplateList; +} + +void LLVivoxVoiceClient::addVoiceFont(const S32 font_index, +								 const std::string &name, +								 const std::string &description, +								 const LLDate &expiration_date, +								 bool has_expired, +								 const S32 font_type, +								 const S32 font_status, +								 const bool template_font) +{ +	// Vivox SessionFontIDs are not guaranteed to remain the same between +	// sessions or grids so use a UUID for the name. + +	// If received name is not a UUID, fudge one by hashing the name and type. +	LLUUID font_id; +	if (LLUUID::validate(name)) +	{ +		font_id = LLUUID(name); +	} +	else +	{ +		font_id.generate(STRINGIZE(font_type << ":" << name)); +	} + +	voiceFontEntry *font = NULL; + +	voice_font_map_t& font_map = template_font ? mVoiceFontTemplateMap : mVoiceFontMap; +	voice_effect_list_t& font_list = template_font ? mVoiceFontTemplateList : mVoiceFontList; + +	// Check whether we've seen this font before. +	voice_font_map_t::iterator iter = font_map.find(font_id); +	bool new_font = (iter == font_map.end()); + +	// Override the has_expired flag if we have passed the expiration_date as a double check. +	if (expiration_date.secondsSinceEpoch() < (LLDate::now().secondsSinceEpoch() + VOICE_FONT_EXPIRY_INTERVAL)) +	{ +		has_expired = true; +	} + +	if (has_expired) +	{ +		LL_DEBUGS("Voice") << "Expired " << (template_font ? "Template " : "") +		<< expiration_date.asString() << " " << font_id +		<< " (" << font_index << ") " << name << LL_ENDL; + +		// Remove existing session fonts that have expired since we last saw them. +		if (!new_font && !template_font) +		{ +			deleteVoiceFont(font_id); +		} +		return; +	} + +	if (new_font) +	{ +		// If it is a new font create a new entry. +		font = new voiceFontEntry(font_id); +	} +	else +	{ +		// Not a new font, update the existing entry +		font = iter->second; +	} + +	if (font) +	{ +		font->mFontIndex = font_index; +		// Use the description for the human readable name if available, as the +		// "name" may be a UUID. +		font->mName = description.empty() ? name : description; +		font->mFontType = font_type; +		font->mFontStatus = font_status; + +		// If the font is new or the expiration date has changed the expiry timers need updating. +		if (!template_font && (new_font || font->mExpirationDate != expiration_date)) +		{ +			font->mExpirationDate = expiration_date; + +			// Set the expiry timer to trigger a notification when the voice font can no longer be used. +			font->mExpiryTimer.start(); +			font->mExpiryTimer.setExpiryAt(expiration_date.secondsSinceEpoch() - VOICE_FONT_EXPIRY_INTERVAL); + +			// Set the warning timer to some interval before actual expiry. +			S32 warning_time = gSavedSettings.getS32("VoiceEffectExpiryWarningTime"); +			if (warning_time != 0) +			{ +				font->mExpiryWarningTimer.start(); +				F64 expiry_time = (expiration_date.secondsSinceEpoch() - (F64)warning_time); +				font->mExpiryWarningTimer.setExpiryAt(expiry_time - VOICE_FONT_EXPIRY_INTERVAL); +			} +			else +			{ +				// Disable the warning timer. +				font->mExpiryWarningTimer.stop(); +			} + +			 // Only flag new session fonts after the first time we have fetched the list. +			if (mVoiceFontsReceived) +			{ +				font->mIsNew = true; +				mVoiceFontsNew = true; +			} +		} + +		LL_DEBUGS("Voice") << (template_font ? "Template " : "") +			<< font->mExpirationDate.asString() << " " << font->mID +			<< " (" << font->mFontIndex << ") " << name << LL_ENDL; + +		if (new_font) +		{ +			font_map.insert(voice_font_map_t::value_type(font->mID, font)); +			font_list.insert(voice_effect_list_t::value_type(font->mName, font->mID)); +		} + +		mVoiceFontListDirty = true; + +		// Debugging stuff + +		if (font_type < VOICE_FONT_TYPE_NONE || font_type >= VOICE_FONT_TYPE_UNKNOWN) +		{ +			LL_DEBUGS("Voice") << "Unknown voice font type: " << font_type << LL_ENDL; +		} +		if (font_status < VOICE_FONT_STATUS_NONE || font_status >= VOICE_FONT_STATUS_UNKNOWN) +		{ +			LL_DEBUGS("Voice") << "Unknown voice font status: " << font_status << LL_ENDL; +		} +	} +} + +void LLVivoxVoiceClient::expireVoiceFonts() +{ +	// *TODO: If we are selling voice fonts in packs, there are probably +	// going to be a number of fonts with the same expiration time, so would +	// be more efficient to just keep a list of expiration times rather +	// than checking each font individually. + +	bool have_expired = false; +	bool will_expire = false; +	bool expired_in_use = false; + +	LLUUID current_effect = LLVoiceClient::instance().getVoiceEffectDefault(); + +	voice_font_map_t::iterator iter; +	for (iter = mVoiceFontMap.begin(); iter != mVoiceFontMap.end(); ++iter) +	{ +		voiceFontEntry* voice_font = iter->second; +		LLFrameTimer& expiry_timer  = voice_font->mExpiryTimer; +		LLFrameTimer& warning_timer = voice_font->mExpiryWarningTimer; + +		// Check for expired voice fonts +		if (expiry_timer.getStarted() && expiry_timer.hasExpired()) +		{ +			// Check whether it is the active voice font +			if (voice_font->mID == current_effect) +			{ +				// Reset to no voice effect. +				setVoiceEffect(LLUUID::null); +				expired_in_use = true; +			} + +			LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " has expired." << LL_ENDL; +			deleteVoiceFont(voice_font->mID); +			have_expired = true; +		} + +		// Check for voice fonts that will expire in less that the warning time +		if (warning_timer.getStarted() && warning_timer.hasExpired()) +		{ +			LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " will expire soon." << LL_ENDL; +			will_expire = true; +			warning_timer.stop(); +		} +	} + +	LLSD args; +	args["URL"] = LLTrans::getString("voice_morphing_url"); + +	// Give a notification if any voice fonts have expired. +	if (have_expired) +	{ +		if (expired_in_use) +		{ +			LLNotificationsUtil::add("VoiceEffectsExpiredInUse", args); +		} +		else +		{ +			LLNotificationsUtil::add("VoiceEffectsExpired", args); +		} + +		// Refresh voice font lists in the UI. +		notifyVoiceFontObservers(); +	} + +	// Give a warning notification if any voice fonts are due to expire. +	if (will_expire) +	{ +		S32 seconds = gSavedSettings.getS32("VoiceEffectExpiryWarningTime"); +		args["INTERVAL"] = llformat("%d", seconds / SEC_PER_DAY); + +		LLNotificationsUtil::add("VoiceEffectsWillExpire", args); +	} +} + +void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id) +{ +	// Remove the entry from the voice font list. +	voice_effect_list_t::iterator list_iter = mVoiceFontList.begin(); +	while (list_iter != mVoiceFontList.end()) +	{ +		if (list_iter->second == id) +		{ +			LL_DEBUGS("Voice") << "Removing " << id << " from the voice font list." << LL_ENDL; +			mVoiceFontList.erase(list_iter++); +			mVoiceFontListDirty = true; +		} +		else +		{ +			++list_iter; +		} +	} + +	// Find the entry in the voice font map and erase its data. +	voice_font_map_t::iterator map_iter = mVoiceFontMap.find(id); +	if (map_iter != mVoiceFontMap.end()) +	{ +		delete map_iter->second; +	} + +	// Remove the entry from the voice font map. +	mVoiceFontMap.erase(map_iter); +} + +void LLVivoxVoiceClient::deleteAllVoiceFonts() +{ +	mVoiceFontList.clear(); + +	voice_font_map_t::iterator iter; +	for (iter = mVoiceFontMap.begin(); iter != mVoiceFontMap.end(); ++iter) +	{ +		delete iter->second; +	} +	mVoiceFontMap.clear(); +} + +void LLVivoxVoiceClient::deleteVoiceFontTemplates() +{ +	mVoiceFontTemplateList.clear(); + +	voice_font_map_t::iterator iter; +	for (iter = mVoiceFontTemplateMap.begin(); iter != mVoiceFontTemplateMap.end(); ++iter) +	{ +		delete iter->second; +	} +	mVoiceFontTemplateMap.clear(); +} + +S32 LLVivoxVoiceClient::getVoiceFontIndex(const LLUUID& id) const +{ +	S32 result = 0; +	if (!id.isNull()) +	{ +		voice_font_map_t::const_iterator it = mVoiceFontMap.find(id); +		if (it != mVoiceFontMap.end()) +		{ +			result = it->second->mFontIndex; +		} +		else +		{ +			LL_DEBUGS("Voice") << "Selected voice font " << id << " is not available." << LL_ENDL; +		} +	} +	return result; +} + +S32 LLVivoxVoiceClient::getVoiceFontTemplateIndex(const LLUUID& id) const +{ +	S32 result = 0; +	if (!id.isNull()) +	{ +		voice_font_map_t::const_iterator it = mVoiceFontTemplateMap.find(id); +		if (it != mVoiceFontTemplateMap.end()) +		{ +			result = it->second->mFontIndex; +		} +		else +		{ +			LL_DEBUGS("Voice") << "Selected voice font template " << id << " is not available." << LL_ENDL; +		} +	} +	return result; +} + +void LLVivoxVoiceClient::accountGetSessionFontsSendMessage() +{ +	if(!mAccountHandle.empty()) +	{ +		std::ostringstream stream; + +		LL_DEBUGS("Voice") << "Requesting voice font list." << LL_ENDL; + +		stream +		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetSessionFonts.1\">" +		<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "</Request>" +		<< "\n\n\n"; + +		writeString(stream.str()); +	} +} + +void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage() +{ +	if(!mAccountHandle.empty()) +	{ +		std::ostringstream stream; + +		LL_DEBUGS("Voice") << "Requesting voice font template list." << LL_ENDL; + +		stream +		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetTemplateFonts.1\">" +		<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "</Request>" +		<< "\n\n\n"; + +		writeString(stream.str()); +	} +} + +void LLVivoxVoiceClient::sessionSetVoiceFontSendMessage(sessionState *session) +{ +	S32 font_index = getVoiceFontIndex(session->mVoiceFontID); +	LL_DEBUGS("Voice") << "Requesting voice font: " << session->mVoiceFontID << " (" << font_index << "), session handle: " << session->mHandle << LL_ENDL; + +	std::ostringstream stream; + +	stream +	<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetVoiceFont.1\">" +	<< "<SessionHandle>" << session->mHandle << "</SessionHandle>" +	<< "<SessionFontID>" << font_index << "</SessionFontID>" +	<< "</Request>\n\n\n"; + +	writeString(stream.str()); +} + +void LLVivoxVoiceClient::accountGetSessionFontsResponse(int statusCode, const std::string &statusString) +{ +	// Voice font list entries were updated via addVoiceFont() during parsing. +	if(getState() == stateVoiceFontsWait) +	{ +		setState(stateVoiceFontsReceived); +	} + +	notifyVoiceFontObservers(); +	mVoiceFontsReceived = true; +} + +void LLVivoxVoiceClient::accountGetTemplateFontsResponse(int statusCode, const std::string &statusString) +{ +	// Voice font list entries were updated via addVoiceFont() during parsing. +	notifyVoiceFontObservers(); +} +void LLVivoxVoiceClient::addObserver(LLVoiceEffectObserver* observer) +{ +	mVoiceFontObservers.insert(observer); +} + +void LLVivoxVoiceClient::removeObserver(LLVoiceEffectObserver* observer) +{ +	mVoiceFontObservers.erase(observer); +} + +void LLVivoxVoiceClient::notifyVoiceFontObservers() +{ +	LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL; + +	for (voice_font_observer_set_t::iterator it = mVoiceFontObservers.begin(); +		 it != mVoiceFontObservers.end(); +		 ) +	{ +		LLVoiceEffectObserver* observer = *it; +		observer->onVoiceEffectChanged(mVoiceFontListDirty); +		// In case onVoiceEffectChanged() deleted an entry. +		it = mVoiceFontObservers.upper_bound(observer); +	} +	mVoiceFontListDirty = false; + +	// If new Voice Fonts have been added notify the user. +	if (mVoiceFontsNew) +	{ +		if(mVoiceFontsReceived) +		{ +			LLNotificationsUtil::add("VoiceEffectsNew"); +		} +		mVoiceFontsNew = false; +	} +} + +void LLVivoxVoiceClient::enablePreviewBuffer(bool enable) +{ +	mCaptureBufferMode = enable; +	if(mCaptureBufferMode && getState() >= stateNoChannel) +	{ +		LL_DEBUGS("Voice") << "no channel" << LL_ENDL; +		sessionTerminate(); +	} +} + +void LLVivoxVoiceClient::recordPreviewBuffer() +{ +	if (!mCaptureBufferMode) +	{ +		LL_DEBUGS("Voice") << "Not in voice effect preview mode, cannot start recording." << LL_ENDL; +		mCaptureBufferRecording = false; +		return; +	} + +	mCaptureBufferRecording = true; +} + +void LLVivoxVoiceClient::playPreviewBuffer(const LLUUID& effect_id) +{ +	if (!mCaptureBufferMode) +	{ +		LL_DEBUGS("Voice") << "Not in voice effect preview mode, no buffer to play." << LL_ENDL; +		mCaptureBufferRecording = false; +		return; +	} + +	if (!mCaptureBufferRecorded) +	{ +		// Can't play until we have something recorded! +		mCaptureBufferPlaying = false; +		return; +	} + +	mPreviewVoiceFont = effect_id; +	mCaptureBufferPlaying = true; +} + +void LLVivoxVoiceClient::stopPreviewBuffer() +{ +	mCaptureBufferRecording = false; +	mCaptureBufferPlaying = false; +} + +bool LLVivoxVoiceClient::isPreviewRecording() +{ +	return (mCaptureBufferMode && mCaptureBufferRecording); +} + +bool LLVivoxVoiceClient::isPreviewPlaying() +{ +	return (mCaptureBufferMode && mCaptureBufferPlaying); +} + +void LLVivoxVoiceClient::captureBufferRecordStartSendMessage() +{	if(!mAccountHandle.empty()) +	{ +		std::ostringstream stream; + +		LL_DEBUGS("Voice") << "Starting audio capture to buffer." << LL_ENDL; + +		// Start capture +		stream +		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.StartBufferCapture.1\">" +		<< "</Request>" +		<< "\n\n\n"; + +		// Unmute the mic +		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" +			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<Value>false</Value>" +		<< "</Request>\n\n\n"; + +		// Dirty the PTT state so that it will get reset when we finishing previewing +		mPTTDirty = true; + +		writeString(stream.str()); +	} +} + +void LLVivoxVoiceClient::captureBufferRecordStopSendMessage() +{ +	if(!mAccountHandle.empty()) +	{ +		std::ostringstream stream; + +		LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL; + +		// Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing. +		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" +			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +			<< "<Value>true</Value>" +		<< "</Request>\n\n\n"; + +		// Stop capture +		stream +		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">" +			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "</Request>" +		<< "\n\n\n"; + +		writeString(stream.str()); +	} +} + +void LLVivoxVoiceClient::captureBufferPlayStartSendMessage(const LLUUID& voice_font_id) +{ +	if(!mAccountHandle.empty()) +	{ +		// Track how may play requests are sent, so we know how many stop events to +		// expect before play actually stops. +		++mPlayRequestCount; + +		std::ostringstream stream; + +		LL_DEBUGS("Voice") << "Starting audio buffer playback." << LL_ENDL; + +		S32 font_index = getVoiceFontTemplateIndex(voice_font_id); +		LL_DEBUGS("Voice") << "With voice font: " << voice_font_id << " (" << font_index << ")" << LL_ENDL; + +		stream +		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.PlayAudioBuffer.1\">" +			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +			<< "<TemplateFontID>" << font_index << "</TemplateFontID>" +			<< "<FontDelta />" +		<< "</Request>" +		<< "\n\n\n"; + +		writeString(stream.str()); +	} +} + +void LLVivoxVoiceClient::captureBufferPlayStopSendMessage() +{ +	if(!mAccountHandle.empty()) +	{ +		std::ostringstream stream; + +		LL_DEBUGS("Voice") << "Stopping audio buffer playback." << LL_ENDL; + +		stream +		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">" +			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" +		<< "</Request>" +		<< "\n\n\n"; + +		writeString(stream.str()); +	} +}  LLVivoxProtocolParser::LLVivoxProtocolParser()  { @@ -6467,7 +7301,30 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)  			{  				LLVivoxVoiceClient::getInstance()->deleteAllAutoAcceptRules();  			} -			 +			else if (!stricmp("SessionFont", tag)) +			{ +				id = 0; +				nameString.clear(); +				descriptionString.clear(); +				expirationDate = LLDate(); +				hasExpired = false; +				fontType = 0; +				fontStatus = 0; +			} +			else if (!stricmp("TemplateFont", tag)) +			{ +				id = 0; +				nameString.clear(); +				descriptionString.clear(); +				expirationDate = LLDate(); +				hasExpired = false; +				fontType = 0; +				fontStatus = 0; +			} +			else if (!stricmp("MediaCompletionType", tag)) +			{ +				mediaCompletionType.clear(); +			}  		}  	}  	responseDepth++; @@ -6613,8 +7470,43 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  			subscriptionHandle = string;  		else if (!stricmp("SubscriptionType", tag))  			subscriptionType = string; -		 -	 +		else if (!stricmp("SessionFont", tag)) +		{ +			LLVivoxVoiceClient::getInstance()->addVoiceFont(id, nameString, descriptionString, expirationDate, hasExpired, fontType, fontStatus, false); +		} +		else if (!stricmp("TemplateFont", tag)) +		{ +			LLVivoxVoiceClient::getInstance()->addVoiceFont(id, nameString, descriptionString, expirationDate, hasExpired, fontType, fontStatus, true); +		} +		else if (!stricmp("ID", tag)) +		{ +			id = strtol(string.c_str(), NULL, 10); +		} +		else if (!stricmp("Description", tag)) +		{ +			descriptionString = string; +		} +		else if (!stricmp("ExpirationDate", tag)) +		{ +			expirationDate = expiryTimeStampToLLDate(string); +		} +		else if (!stricmp("Expired", tag)) +		{ +			hasExpired = !stricmp(string.c_str(), "1"); +		} +		else if (!stricmp("Type", tag)) +		{ +			fontType = strtol(string.c_str(), NULL, 10); +		} +		else if (!stricmp("Status", tag)) +		{ +			fontStatus = strtol(string.c_str(), NULL, 10); +		} +		else if (!stricmp("MediaCompletionType", tag)) +		{ +			mediaCompletionType = string;; +		} +  		textBuffer.clear();  		accumulateText= false; @@ -6643,6 +7535,21 @@ void LLVivoxProtocolParser::CharData(const char *buffer, int length)  // -------------------------------------------------------------------------------- +LLDate LLVivoxProtocolParser::expiryTimeStampToLLDate(const std::string& vivox_ts) +{ +	// *HACK: Vivox reports the time incorrectly. LLDate also only parses a +	// subset of valid ISO 8601 dates (only handles Z, not offsets). +	// So just use the date portion and fix the time here. +	std::string time_stamp = vivox_ts.substr(0, 10); +	time_stamp += VOICE_FONT_EXPIRY_TIME; + +	LL_DEBUGS("VivoxProtocolParser") << "Vivox timestamp " << vivox_ts << " modified to: " << time_stamp << LL_ENDL; + +	return LLDate(time_stamp); +} + +// -------------------------------------------------------------------------------- +  void LLVivoxProtocolParser::processResponse(std::string tag)  {  	LL_DEBUGS("VivoxProtocolParser") << tag << LL_ENDL; @@ -6696,7 +7603,17 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			 </Event>  			 */  			LLVivoxVoiceClient::getInstance()->mediaStreamUpdatedEvent(sessionHandle, sessionGroupHandle, statusCode, statusString, state, incoming); -		}		 +		} +		else if (!stricmp(eventTypeCstr, "MediaCompletionEvent")) +		{ +			/* +			<Event type="MediaCompletionEvent"> +			<SessionGroupHandle /> +			<MediaCompletionType>AuxBufferAudioCapture</MediaCompletionType> +			</Event> +			*/ +			LLVivoxVoiceClient::getInstance()->mediaCompletionEvent(sessionGroupHandle, mediaCompletionType); +		}  		else if (!stricmp(eventTypeCstr, "TextStreamUpdatedEvent"))  		{  			/* @@ -6757,6 +7674,9 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  		}  		else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent"))  		{ +			// These are really spammy in tuning mode +			squelchDebugOutput = true; +  			LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy);  		}  		else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent")) @@ -6871,6 +7791,14 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			// We don't need to process these, but they're so spammy we don't want to log them.  			squelchDebugOutput = true;  		} +		else if (!stricmp(actionCstr, "Account.GetSessionFonts.1")) +		{ +			LLVivoxVoiceClient::getInstance()->accountGetSessionFontsResponse(statusCode, statusString); +		} +		else if (!stricmp(actionCstr, "Account.GetTemplateFonts.1")) +		{ +			LLVivoxVoiceClient::getInstance()->accountGetTemplateFontsResponse(statusCode, statusString); +		}  		/*  		 else if (!stricmp(actionCstr, "Account.ChannelGetList.1"))  		 { diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index d10a562616..f858f8f74e 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -2,25 +2,31 @@   * @file llvoicevivox.h   * @brief Declaration of LLDiamondwareVoiceClient class which is the interface to the voice client process.   * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-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. + * 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   *  - * 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. + * 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   *  - * 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 + * 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.   *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$   */  #ifndef LL_VOICE_VIVOX_H diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index bf5bd87ad6..0569b4d515 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -47,8 +47,8 @@           width="263">          <layout_panel           follows="top|left|right" -         user_resize="false" -         auto_resize="false" +          user_resize="false"  +         auto_resize="false"            layout="topleft"           height="20"           name="my_panel"> @@ -123,7 +123,7 @@            layout="topleft"            left="2"            top_pad="0" -          height="132" +          height="132"             name="callers_panel"            user_resize="false"             width="280"> diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml index 9bf9cc6c77..edc25348e4 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml @@ -1,18 +1,18 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - legacy_header_height="27" + legacy_header_height="18"   can_resize="true" - height="500" + height="420"   name="voice_effects"   help_topic="voice_effects" - title="VOICE MORPHING" + title="PREVIEW VOICE MORPHING"   background_visible="true"   follows="all"   label="Places"   layout="topleft" - min_height="360" - min_width="200" - width="300"> + min_height="350" + min_width="330" + width="455">    <string name="no_voice_effect">      (No Voice Morph)    </string> @@ -25,22 +25,8 @@    <string name="new_voice_effect">      (New!)    </string> - <text -   height="16" -   word_wrap="true" -   use_ellipses="true" -   type="string" -   follows="left|top|right" -   layout="topleft" -   font="SansSerifBold" -   color="White" -   left="10" -   name="preview_text" -   right="-10" -   top="27">To Preview -   </text>    <text -   height="23" +   height="68"     word_wrap="true"     use_ellipses="true"     type="string" @@ -48,20 +34,22 @@     layout="topleft"     left="10"     name="status_text" -   right="-5" -   top_pad="0"> -Record a sample, then click on a voice to hear how it will sound. +   right="-10" +   top="25"> +To preview any of the Voice Morphing effects, click the Record button to record a short snippet of voice, then click any Voice Morph in the list to hear how it will sound. + +To reconnect to Nearby Voice simply close this window.    </text>    <button     follows="left|top"     height="23" -   label="Record" +   label="Record Sample"     layout="topleft"     left="10"     name="record_btn"     tool_tip="Record a sample of your voice."     top_pad="5" -   width="100"> +   width="150">      <button.commit_callback       function="VoiceEffect.Record" />    </button> @@ -73,22 +61,22 @@ Record a sample, then click on a voice to hear how it will sound.     left_delta="0"     name="record_stop_btn"     top_delta="0" -   width="100"> +   width="150">      <button.commit_callback       function="VoiceEffect.Stop" />    </button>    <text -   height="23" +   height="18"     halign="right"     use_ellipses="true"     type="string"     follows="left|top|right"     layout="topleft"     left_pad="10" -   top_delta="10"     name="voice_morphing_link" -   right="-10"> -    [[URL] Subscribe Now] +   right="-10" +   top_delta="5"> +    [[URL] Get Voice Morphing]    </text>    <scroll_list     bottom="-10" @@ -100,16 +88,14 @@ Record a sample, then click on a voice to hear how it will sound.     name="voice_effect_list"     right="-10"     tool_tip="Record a sample of your voice, then click an effect to preview." -   top="95"> +   top="128">      <scroll_list.columns -     label="Voice Name" -     name="name" -     relative_width="0.60" /> +     label="Voice Morph" +     name="name" relative_width="0.41"/>      <scroll_list.columns       dynamic_width="true"       label="Expires"       name="expires" -     relative_width="0.30" /> +	 relative_width="0.59" />    </scroll_list> -  </floater> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 63ff7047b4..2641ce4ee4 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -707,6 +707,13 @@           label="Options"           name="Options"           tear_off="true"> +            <menu_item_call +             label="Set Default Upload Permissions" +             name="perm prefs"> +                <menu_item_call.on_click +                 function="Floater.Toggle" +                 parameter="perm_prefs" /> +            </menu_item_call>  	   <menu_item_check  	       label="Show Advanced Permissions"  	       name="DebugPermissions"> @@ -866,13 +873,8 @@                   function="File.UploadBulk"                   parameter="" />              </menu_item_call> -            <menu_item_call -             label="Set Default Upload Permissions" -             name="perm prefs"> -                <menu_item_call.on_click -                 function="Floater.Toggle" -                 parameter="perm_prefs" /> -            </menu_item_call> +            <menu_item_separator +             layout="topleft" />          </menu>      </menu>      <menu @@ -925,7 +927,7 @@          <menu_item_check           label="Show Advanced Menu"           name="Show Advanced Menu" -         shortcut="control|alt|shift|D"> +         shortcut="control|alt|D">            <on_check             function="CheckControl"             parameter="UseDebugMenus" /> @@ -1475,18 +1477,6 @@                  <menu_item_call.on_click                   function="View.DefaultUISize" />              </menu_item_call> -            <!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility.  The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. --> -            <menu_item_check -               label="Show Advanced Menu - legacy shortcut" -               name="Show Advanced Menu - legacy shortcut" -               shortcut="control|alt|D"> -              <on_check -		 function="CheckControl" -		 parameter="UseDebugMenus" /> -              <on_click -		 function="ToggleControl" -		 parameter="UseDebugMenus" /> -            </menu_item_check>              <menu_item_separator/>              <menu_item_check               label="Always Run" @@ -1662,6 +1652,7 @@               function="ToggleControl"               parameter="QAMode" />          </menu_item_check> +          </menu>      <menu       create_jump_keys="true" @@ -3287,4 +3278,4 @@              </menu>          </menu>      </menu> -</menu_bar> +</menu_bar>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3576462cca..6d3d0f13bf 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -817,17 +817,6 @@ Delete pick <nolink>[PICK]</nolink>?    <notification     icon="alertmodal.tga" -   name="DeleteOutfits" -   type="alertmodal"> -    Delete the selected outfit? -    <usetemplate -     name="okcancelbuttons" -     notext="Cancel" -     yestext="OK"/> -  </notification> - -  <notification -   icon="alertmodal.tga"     name="PromptGoToEventsPage"     type="alertmodal">  Go to the [SECOND_LIFE] events web page? @@ -1408,7 +1397,8 @@ Unable to encode file: [FILE]     icon="alertmodal.tga"     name="CorruptedProtectedDataStore"     type="alertmodal"> -   We can't fill in your username and password.  This may happen when you change network setup +  We are unable to read your protected data so it is being reset. +   This may happen when you change network setup.      <usetemplate       name="okbutton" @@ -2076,7 +2066,6 @@ Would you be my friend?         name="Cancel"         text="Cancel"/>      </form> -    <unique/>    </notification>    <notification @@ -2109,7 +2098,7 @@ Would you be my friend?     type="alertmodal">      New outfit name:      <form name="form"> -      <input name="new_name" type="text" width="300"> +      <input name="new_name" type="text">          [NAME]        </input>        <button @@ -4529,6 +4518,18 @@ Uploading in-world and web site snapshots...    </notification>    <notification +   icon="alertmodal.tga" +   name="UploadConfirmation" +   type="alertmodal"> +Uploading costs L$[AMOUNT]. +Do you wish to proceed? +    <usetemplate +     name="okcancelbuttons" +     notext="Cancel" +     yestext="Upload"/> +  </notification> + +  <notification     icon="notify.tga"     name="UploadPayment"     persist="true" @@ -4897,10 +4898,6 @@ If you want to view streaming media on parcels that support it you should go to     persist="true"     type="notify">  No Media Plugin was found to handle the "[MIME_TYPE]" mime type.  Media of this type will be unavailable. -    <unique> -      <context key="[MIME_TYPE]"/> -    </unique> -    </notification>    <notification     icon="alertmodal.tga" @@ -5493,6 +5490,7 @@ If you stay in this region you will be logged out.    <notification     icon="notify.tga"     name="LoadWebPage" +   persist="true"     type="notify">  Load web page [URL]? @@ -5529,6 +5527,14 @@ Failed to find [TYPE] named [DESC] in database.    <notification     icon="notify.tga" +   name="ShareToWebFailed" +   persist="true" +   type="notify"> +    Failed to upload image to web. +  </notification> +   +  <notification +   icon="notify.tga"     name="InvalidWearable"     persist="true"     type="notify"> @@ -5592,6 +5598,7 @@ Grant this request?    <notification     icon="notify.tga"     name="ScriptDialog" +   persist="true"     type="notify">  [FIRST] [LAST]'s '[TITLE]'  [MESSAGE] @@ -5606,6 +5613,7 @@ Grant this request?    <notification     icon="notify.tga"     name="ScriptDialogGroup" +   persist="true"     type="notify">  [GROUPNAME]'s '[TITLE]'  [MESSAGE] @@ -6199,7 +6207,7 @@ The button will be shown when there is enough space for it.     icon="notifytip.tga"     name="ShareNotification"     type="notifytip"> -Select residents to share with. +Drag items from inventory onto a person in the resident picker    </notification>    <notification     icon="notifytip.tga" @@ -6221,7 +6229,7 @@ With the following Residents:     icon="notifytip.tga"     name="ItemsShared"     type="notifytip"> -Items successfully shared. +Items are successfully shared.    </notification>    <notification     icon="notifytip.tga" @@ -6296,39 +6304,36 @@ Avatar '[NAME]' entered appearance mode.  Avatar '[NAME]' left appearance mode.    </notification> -  <notification +    <notification     icon="alertmodal.tga"     name="NoConnect"     type="alertmodal"> -We're having trouble connecting using [PROTOCOL] [HOSTID]. -Please check your network and firewall setup. -    <form name="form"> -      <button -       default="true" -       index="0" -       name="OK" -       text="OK"/> -    </form> -  </notification> - -  <notification -   icon="alertmodal.tga" -   name="NoVoiceConnect" -   type="alertmodal"> -We're having trouble connecting to your voice server: - -[HOSTID] +        We're having trouble connecting using [PROTOCOL] [HOSTID]. +        Please check your network and firewall setup. +        <form name="form"> +            <button +               default="true" +               index="0" +               name="OK" +               text="OK"/> +        </form> +    </notification> -Voice communications will not be available. -Please check your network and firewall setup. -    <form name="form"> -      <button -       default="true" -       index="0" -       name="OK" -       text="OK"/> -    </form> -  </notification> +    <notification +          icon="alertmodal.tga" +          name="NoVoiceConnect" +          type="alertmodal"> +        We're having trouble connecting your voiceserver using [HOSTID]. +        Voice communications will not be available. +        Please check your network and firewall setup. +        <form name="form"> +            <button +               default="true" +               index="0" +               name="OK" +               text="OK"/> +        </form> +    </notification>    <notification     icon="notifytip.tga" @@ -6340,21 +6345,13 @@ Avatar '[NAME]' left as fully loaded.    <notification     icon="notifytip.tga" -   name="AvatarRezSelfBakedTextureUploadNotification" +   name="AvatarRezSelfBakeNotification"     type="notifytip">  ( [EXISTENCE] seconds alive )  You uploaded a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds.    </notification>    <notification -   icon="notifytip.tga" -   name="AvatarRezSelfBakedTextureUpdateNotification" -   type="notifytip"> -( [EXISTENCE] seconds alive ) -You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds. -  </notification> - -  <notification     icon="alertmodal.tga"     name="ConfirmLeaveCall"     type="alert"> @@ -6364,7 +6361,7 @@ Are you sure you want to leave this call?       name="okcancelignore"       notext="No"       yestext="Yes"/> -    <unique/> +     <unique/>    </notification>    <notification @@ -6381,7 +6378,7 @@ Mute everyone?       name="okcancelignore"       yestext="Ok"       notext="Cancel"/> -    <unique/> +     <unique/>    </notification>    <global name="UnsupportedCPU"> @@ -6410,14 +6407,11 @@ If you continue to have problems, please visit the [SUPPORT_SITE].  - Your system memory does not meet the minimum requirements.    </global> -<!-- these are alert strings from server. the name needs to match entire the server string, and needs to be changed +<!-- this is alert string from server. the name needs to match entire the server string, and needs to be changed  	whenever the server string changes -->     <global name="You can only set your 'Home Location' on your land or at a mainland Infohub.">  If you own a piece of land, you can make it your home location.  Otherwise, you can look at the Map and find places marked "Infohub".    </global> -  <global name="You died and have been teleported to your home location"> -You died and have been teleported to your home location. -  </global>  </notifications> diff --git a/indra/newview/skins/default/xui/en/panel_voice_effect.xml b/indra/newview/skins/default/xui/en/panel_voice_effect.xml index 93e79b7328..c575ca468c 100644 --- a/indra/newview/skins/default/xui/en/panel_voice_effect.xml +++ b/indra/newview/skins/default/xui/en/panel_voice_effect.xml @@ -6,7 +6,7 @@   name="panel_voice_effect"   width="200">    <string name="no_voice_effect"> -    Voice Morphing Off +    No Voice Morph    </string>    <string name="preview_voice_effects">      Preview Voice Morphing  ▶ @@ -19,11 +19,11 @@     follows="left|top|right"     height="23"     name="voice_effect" -   tool_tip="Select a Voice Morph to change your voice" +   tool_tip="Select a Voice Morphing effect to change your voice."     top_pad="0"     width="200">      <combo_box.item -     label="Voice Morphing Off" +     label="No Voice Morph"       name="no_voice_effect"  	 top_pad="0"       value="0" /> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 048de70045..0d14a6b3c8 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -67,7 +67,7 @@  	<string name="SentToInvalidRegion">You were sent to an invalid region.</string>  	<string name="TestingDisconnect">Testing viewer disconnect</string> -	<!-- Tooltip --> +	<!-- Tooltip, lltooltipview.cpp -->  	<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->  	<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->  	<string name="TooltipOwner">Owner:</string> <!-- Owner name follows --> @@ -83,7 +83,6 @@  	<string name="TooltipFlagNoScripts">No Scripts</string>  	<string name="TooltipLand">Land:</string>  	<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string> -	<string name="TooltipPrice" value="L$[AMOUNT]: "/>  	<!-- tooltips for Urls -->  	<string name="TooltipHttpUrl">Click to view this web page</string> @@ -104,6 +103,8 @@  	<string name="TooltipMapUrl">Click to view this location on a map</string>  	<string name="TooltipSLAPP">Click to run the secondlife:// command</string>  	<string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />	 +  <string name="TooltipPrice" value=" L$[PRICE]-" /> +    	<!-- text for SLURL labels -->  	<string name="SLurlLabelTeleport">Teleport to</string> @@ -135,8 +136,7 @@  	<string name="RetrievingData">Retrieving...</string>  	<string name="ReleaseNotes">Release Notes</string> -	<!-- Always mark translate="false" for strings that are nothing but URLs, as they don't need translation. --> -	<string name="RELEASE_NOTES_BASE_URL" translate="false">http://wiki.secondlife.com/wiki/Release_Notes/</string> +	<string name="RELEASE_NOTES_BASE_URL">http://secondlife.com/app/releasenotes/</string>  	<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->  	<string name="LoadingData">Loading...</string> @@ -278,7 +278,6 @@  	<!-- world map -->  	<string name="texture_loading">Loading...</string>  	<string name="worldmap_offline">Offline</string> -	<string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE]</string>  	<string name="worldmap_results_none_found">None found.</string>  	<!-- animations uploading status codes --> @@ -1813,8 +1812,7 @@ Clears (deletes) the media and all params from the given face.  	<string name="skirt">Skirt</string>  	<string name="alpha">Alpha</string>  	<string name="tattoo">Tattoo</string> -  <string name="invalid">invalid</string> -  <string name="none">none</string> +	<string name="invalid">invalid</string>    <!-- Not Worn Wearable Types -->  	<string name="shirt_not_worn">Shirt not worn</string> @@ -1830,26 +1828,9 @@ Clears (deletes) the media and all params from the given face.  	<string name="tattoo_not_worn">Tattoo not worn</string>  	<string name="invalid_not_worn">invalid</string> -	<!-- Create new wearable of the specified type --> -	<string name="create_new_shape">Create new shape</string> -	<string name="create_new_skin">Create new skin</string> -	<string name="create_new_hair">Create new hair</string> -	<string name="create_new_eyes">Create new eyes</string> -	<string name="create_new_shirt">Create new shirt</string> -	<string name="create_new_pants">Create new pants</string> -	<string name="create_new_shoes">Create new shoes</string> -	<string name="create_new_socks">Create new socks</string> -	<string name="create_new_jacket">Create new jacket</string> -	<string name="create_new_gloves">Create new gloves</string> -	<string name="create_new_undershirt">Create new undershirt</string> -	<string name="create_new_underpants">Create new underpants</string> -	<string name="create_new_skirt">Create new skirt</string> -	<string name="create_new_alpha">Create new alpha</string> -	<string name="create_new_tattoo">Create new tattoo</string> -	<string name="create_new_invalid">invalid</string> -    <!-- Wearable List-->    <string name="NewWearable">New [WEARABLE_ITEM]</string> +  <string name="CreateNewWearable">Create [WEARABLE_TYPE]</string>  	<!-- LLGroupNotify -->  	<!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 --> @@ -1914,7 +1895,6 @@ Clears (deletes) the media and all params from the given face.  	<string name="AnimFlagStop"  value=" Stop Animation :    " />  	<string name="AnimFlagStart" value=" Start Animation :   " />  	<string name="Wave"          value=" Wave " /> -	<string name="GestureActionNone" value="None" />  	<string name="HelloAvatar"   value=" Hello, avatar! " />  	<string name="ViewAllGestures"  value="  View All >>" />  	<string name="GetMoreGestures"  value="  Get More >>" /> @@ -1957,12 +1937,8 @@ Clears (deletes) the media and all params from the given face.  	<string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string>  	<string name="InvFolder Animations">Animations</string>  	<string name="InvFolder Gestures">Gestures</string> -	<string name="InvFolder Favorite">Favorites</string> -  <!-- historically default name of the Favorites folder can start from either "f" or "F" letter. -  We should localize both of them with the same value -->  	<string name="InvFolder favorite">Favorites</string>  	<string name="InvFolder Current Outfit">Current Outfit</string> -	<string name="InvFolder Initial Outfits">Initial Outfits</string>  	<string name="InvFolder My Outfits">My Outfits</string>  	<string name="InvFolder Accessories">Accessories</string> @@ -2103,7 +2079,6 @@ Clears (deletes) the media and all params from the given face.  	<string name="SummaryForTheWeek"    value="Summary for this week, beginning on " />  	<string name="NextStipendDay"       value="The next stipend day is " />  	<string name="GroupIndividualShare" value="                      Group       Individual Share" /> -	<string name="GroupColumn"          value="                      Group" />  	<string name="Balance">Balance</string>  	<string name="Credits">Credits</string>  	<string name="Debits">Debits</string> @@ -2182,7 +2157,6 @@ Clears (deletes) the media and all params from the given face.  	<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>  	<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>  	<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string> -	<string name="Bad attachment point">Invalid Attachment Point</string>  	<!-- script editor -->  	<string name="CursorPos">Line [LINE], Column [COLUMN]</string> @@ -2195,8 +2169,8 @@ Clears (deletes) the media and all params from the given face.  	<string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>  	<!-- panel contents --> +	<string name="PanelContentsNewScript">New Script</string>  	<string name="PanelContentsTooltip">Content of object</string> -	<string name="PanelContentsNewScript">New Script</string>	    <!-- panel preferences general -->    <string name="BusyModeResponseDefault">The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.</string> @@ -3143,7 +3117,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].    <string name="group_role_everyone">Everyone</string>    <string name="group_role_officers">Officers</string>    <string name="group_role_owners">Owners</string> -  <string name="group_member_status_online">Online</string>    <string name="uploading_abuse_report">Uploading... @@ -3166,9 +3139,7 @@ Abuse Report</string>    <string name="New Alpha">New Alpha</string>    <string name="New Tattoo">New Tattoo</string>    <string name="Invalid Wearable">Invalid Wearable</string> -  <string name="New Gesture">New Gesture</string>    <string name="New Script">New Script</string> -  <string name="New Note">New Note</string>    <string name="New Folder">New Folder</string>    <string name="Contents">Contents</string>    <string name="Gesture">Gesture</string> @@ -3190,20 +3161,13 @@ Abuse Report</string>    <string name="Male - Stick tougue out">Male - Stick tougue out</string>    <string name="Male - Wow">Male - Wow</string> -  <string name="Female - Chuckle">Female - Chuckle</string> -  <string name="Female - Cry">Female - Cry</string> -  <string name="Female - Embarrassed">Female - Embarrassed</string>    <string name="Female - Excuse me">Female - Excuse me</string>    <string name="Female - Get lost">Female - Get lost</string>    <string name="Female - Blow kiss">Female - Blow kiss</string>    <string name="Female - Boo">Female - Boo</string>    <string name="Female - Bored">Female - Bored</string>    <string name="Female - Hey">Female - Hey</string> -  <string name="Female - Hey baby">Female - Hey baby</string>    <string name="Female - Laugh">Female - Laugh</string> -  <string name="Female - Looking good">Female - Looking good</string> -  <string name="Female - Over here">Female - Over here</string> -  <string name="Female - Please">Female - Please</string>    <string name="Female - Repulsed">Female - Repulsed</string>    <string name="Female - Shrug">Female - Shrug</string>    <string name="Female - Stick tougue out">Female - Stick tougue out</string> @@ -3217,12 +3181,12 @@ Abuse Report</string>    <!-- language specific white-space characters, delimiters, spacers, item separation symbols -->    <string name="sentences_separator" value=" "></string> -  <string name="words_separator" value=", "/> +  <string name="words_separator">, </string>    <string name="server_is_down">  	Despite our best efforts, something unexpected has gone wrong. -	Please check status.secondlifegrid.net to see if there is a known problem with the service.   +	Please check secondlife.com/status to see if there is a known problem with the service.            If you continue to experience problems, please check your network and firewall setup.    </string> @@ -3236,23 +3200,4 @@ Abuse Report</string>    <string name="dateTimeDayFormat">[MDAY]</string>    <string name="dateTimeAM">AM</string>    <string name="dateTimePM">PM</string> - -  <!--  currency formatting --> -  <string name="LocalEstimateUSD">US$ [AMOUNT]</string> - -  <!-- Group Profile roles and powers --> -  <string name="Membership">Membership</string> -  <string name="Roles">Roles</string> -  <string name="Group Identity">Group Identity</string> -  <string name="Parcel Management">Parcel Management</string> -  <string name="Parcel Identity">Parcel Identity</string> -  <string name="Parcel Settings">Parcel Settings</string> -  <string name="Parcel Powers">Parcel Powers</string> -  <string name="Parcel Access">Parcel Access</string> -  <string name="Parcel Content">Parcel Content</string> -  <string name="Object Management">Object Management</string> -  <string name="Accounting">Accounting</string> -  <string name="Notices">Notices</string> -  <string name="Chat">Chat</string> -    </strings> | 
