aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden
diff options
context:
space:
mode:
authorDavid Seikel2011-02-20 20:31:57 +1000
committerDavid Seikel2011-02-20 20:31:57 +1000
commitd6666d0776985bada40f19c623b86d82a4113f92 (patch)
treeeb4d234a313c51b40f6d53d4a59bdc831a7cd0fc /linden
parentRemove catering to LL's probably illegal attempt to block copying of open sou... (diff)
parentReduce the logging spam to warnings. Debug was too much. (diff)
downloadmeta-impy-d6666d0776985bada40f19c623b86d82a4113f92.zip
meta-impy-d6666d0776985bada40f19c623b86d82a4113f92.tar.gz
meta-impy-d6666d0776985bada40f19c623b86d82a4113f92.tar.bz2
meta-impy-d6666d0776985bada40f19c623b86d82a4113f92.tar.xz
Merge branch 'weekly' into branding
Conflicts (solved): linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp linden/indra/newview/llappviewer.cpp linden/indra/newview/llappviewerwin32.cpp
Diffstat (limited to '')
-rw-r--r--linden/doc/contributions.txt5
-rw-r--r--linden/etc/message.xml20
-rw-r--r--linden/indra/cmake/Boost.cmake4
-rw-r--r--linden/indra/cmake/GStreamer010Plugin.cmake26
-rw-r--r--linden/indra/llaudio/llaudioengine.cpp79
-rw-r--r--linden/indra/llaudio/llaudioengine.h21
-rw-r--r--linden/indra/llaudio/llstreamingaudio.h3
-rw-r--r--linden/indra/llcharacter/llcharacter.cpp4
-rw-r--r--linden/indra/llcharacter/llcharacter.h14
-rw-r--r--linden/indra/llcharacter/llvisualparam.cpp4
-rw-r--r--linden/indra/llcharacter/llvisualparam.h7
-rw-r--r--linden/indra/llcommon/CMakeLists.txt6
-rw-r--r--linden/indra/llcommon/aiaprpool.cpp198
-rw-r--r--linden/indra/llcommon/aiaprpool.h240
-rw-r--r--linden/indra/llcommon/aithreadsafe.h463
-rw-r--r--linden/indra/llcommon/llapp.cpp5
-rw-r--r--linden/indra/llcommon/llapr.cpp299
-rw-r--r--linden/indra/llcommon/llapr.h74
-rw-r--r--linden/indra/llcommon/llavatarname.cpp150
-rw-r--r--linden/indra/llcommon/llavatarname.h105
-rw-r--r--linden/indra/llcommon/llcommon.cpp13
-rw-r--r--linden/indra/llcommon/llcommon.h2
-rw-r--r--linden/indra/llcommon/llerror.cpp5
-rw-r--r--linden/indra/llcommon/llfile.cpp2
-rw-r--r--linden/indra/llcommon/llfindlocale.cpp2
-rw-r--r--linden/indra/llcommon/llfixedbuffer.cpp3
-rw-r--r--linden/indra/llcommon/llmemory.cpp2
-rw-r--r--linden/indra/llcommon/llprocesslauncher.h2
-rw-r--r--linden/indra/llcommon/llscopedvolatileaprpool.h58
-rw-r--r--linden/indra/llcommon/llthread.cpp117
-rw-r--r--linden/indra/llcommon/llthread.h184
-rw-r--r--linden/indra/llcommon/llworkerthread.cpp3
-rw-r--r--linden/indra/llcommon/llworkerthread.h2
-rwxr-xr-xlinden/indra/llcrashlogger/llcrashlogger.cpp3
-rw-r--r--linden/indra/llimage/llimage.cpp2
-rw-r--r--linden/indra/llimage/llimagej2c.cpp15
-rw-r--r--linden/indra/llimage/llimageworker.cpp7
-rw-r--r--linden/indra/llimage/llimageworker.h2
-rw-r--r--linden/indra/llmath/llvolumemgr.cpp4
-rw-r--r--linden/indra/llmessage/CMakeLists.txt2
-rw-r--r--linden/indra/llmessage/llares.cpp17
-rw-r--r--linden/indra/llmessage/llavatarnamecache.cpp859
-rw-r--r--linden/indra/llmessage/llavatarnamecache.h105
-rw-r--r--linden/indra/llmessage/llcachename.h2
-rw-r--r--linden/indra/llmessage/llcurl.cpp2
-rw-r--r--linden/indra/llmessage/lliohttpserver.cpp10
-rw-r--r--linden/indra/llmessage/lliohttpserver.h2
-rw-r--r--linden/indra/llmessage/lliosocket.cpp99
-rw-r--r--linden/indra/llmessage/lliosocket.h33
-rw-r--r--linden/indra/llmessage/llmail.cpp17
-rw-r--r--linden/indra/llmessage/llmail.h4
-rw-r--r--linden/indra/llmessage/llpartdata.cpp90
-rw-r--r--linden/indra/llmessage/llpartdata.h3
-rw-r--r--linden/indra/llmessage/llpumpio.cpp74
-rw-r--r--linden/indra/llmessage/llpumpio.h31
-rw-r--r--linden/indra/llmessage/llregionflags.h9
-rw-r--r--linden/indra/llmessage/llurlrequest.cpp25
-rw-r--r--linden/indra/llmessage/message.cpp17
-rwxr-xr-xlinden/indra/llplugin/llpluginclassmedia.cpp34
-rwxr-xr-xlinden/indra/llplugin/llplugininstance.cpp29
-rwxr-xr-xlinden/indra/llplugin/llpluginmessagepipe.cpp28
-rwxr-xr-xlinden/indra/llplugin/llpluginprocesschild.cpp58
-rwxr-xr-xlinden/indra/llplugin/llpluginprocessparent.cpp123
-rwxr-xr-xlinden/indra/llplugin/llpluginprocessparent.h2
-rwxr-xr-xlinden/indra/llplugin/llpluginsharedmemory.cpp11
-rwxr-xr-xlinden/indra/llplugin/llpluginsharedmemory.h3
-rwxr-xr-xlinden/indra/llplugin/slplugin/slplugin.cpp6
-rwxr-xr-xlinden/indra/llvfs/llpidlock.h2
-rw-r--r--linden/indra/llvfs/llvfs.cpp2
-rw-r--r--linden/indra/llwindow/GL/glh_extensions.h2
-rwxr-xr-xlinden/indra/media_plugins/CMakeLists.txt10
-rw-r--r--linden/indra/media_plugins/gstreamer010/CMakeLists.txt6
-rwxr-xr-xlinden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h2
-rwxr-xr-xlinden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp165
-rw-r--r--linden/indra/media_plugins/webkit/linux_volume_catcher.cpp14
-rw-r--r--linden/indra/media_plugins/webkit/windows_volume_catcher.cpp2
-rw-r--r--linden/indra/newview/CMakeLists.txt30
-rw-r--r--linden/indra/newview/app_settings/cloud.xml88
-rw-r--r--linden/indra/newview/app_settings/logcontrol.xml14
-rw-r--r--linden/indra/newview/app_settings/settings.xml47
-rw-r--r--linden/indra/newview/chatbar_as_cmdline.cpp4
-rw-r--r--linden/indra/newview/kokuastreamingaudio.cpp129
-rw-r--r--linden/indra/newview/kokuastreamingaudio.h71
-rw-r--r--linden/indra/newview/llagent.cpp2
-rw-r--r--linden/indra/newview/llappviewer.cpp155
-rw-r--r--linden/indra/newview/llappviewer.h1
-rw-r--r--linden/indra/newview/llappviewerlinux.cpp1
-rw-r--r--linden/indra/newview/llappviewermacosx.cpp1
-rw-r--r--linden/indra/newview/llappviewerwin32.cpp25
-rw-r--r--linden/indra/newview/llcallingcard.cpp50
-rw-r--r--linden/indra/newview/llcallingcard.h3
-rw-r--r--linden/indra/newview/llfilepicker.cpp2
-rw-r--r--linden/indra/newview/llfirstuse.cpp28
-rw-r--r--linden/indra/newview/llfirstuse.h3
-rw-r--r--linden/indra/newview/llfloateractivespeakers.cpp7
-rw-r--r--linden/indra/newview/llfloateractivespeakers.h3
-rw-r--r--linden/indra/newview/llfloateravatarinfo.cpp10
-rw-r--r--linden/indra/newview/llfloateravatarinfo.h4
-rw-r--r--linden/indra/newview/llfloaterchatterbox.cpp3
-rw-r--r--linden/indra/newview/llfloatercustomize.cpp8
-rw-r--r--linden/indra/newview/llfloaterdirectory.cpp4
-rw-r--r--linden/indra/newview/llfloaterdisplayname.cpp224
-rw-r--r--linden/indra/newview/llfloaterdisplayname.h48
-rw-r--r--linden/indra/newview/llfloaterfriends.cpp75
-rw-r--r--linden/indra/newview/llfloaternewim.cpp20
-rw-r--r--linden/indra/newview/llfloaterregioninfo.cpp206
-rw-r--r--linden/indra/newview/llfloaterregioninfo.h7
-rw-r--r--linden/indra/newview/llfloatertools.cpp4
-rw-r--r--linden/indra/newview/llhoverview.cpp21
-rw-r--r--linden/indra/newview/llimpanel.cpp66
-rw-r--r--linden/indra/newview/llimpanel.h6
-rw-r--r--linden/indra/newview/llmanipscale.cpp2
-rw-r--r--linden/indra/newview/llnamelistctrl.cpp46
-rw-r--r--linden/indra/newview/llnamelistctrl.h5
-rw-r--r--linden/indra/newview/llnetmap.cpp25
-rw-r--r--linden/indra/newview/lloverlaybar.cpp13
-rw-r--r--linden/indra/newview/llpanelavatar.cpp53
-rw-r--r--linden/indra/newview/llpanelavatar.h8
-rw-r--r--linden/indra/newview/llpaneldirfind.cpp8
-rw-r--r--linden/indra/newview/llpanelgeneral.cpp5
-rw-r--r--linden/indra/newview/llpanelgeneral.h3
-rw-r--r--linden/indra/newview/llpanelgroupgeneral.cpp21
-rw-r--r--linden/indra/newview/llstartup.cpp75
-rw-r--r--linden/indra/newview/llstartup.h4
-rw-r--r--linden/indra/newview/lltexlayer.cpp24
-rw-r--r--linden/indra/newview/lltexturecache.cpp5
-rw-r--r--linden/indra/newview/lltexturecache.h3
-rw-r--r--linden/indra/newview/lltexturefetch.cpp3
-rw-r--r--linden/indra/newview/lltoolpie.cpp7
-rw-r--r--linden/indra/newview/llvieweraudio.cpp125
-rw-r--r--linden/indra/newview/llviewercontrol.cpp38
-rw-r--r--linden/indra/newview/llviewerdisplayname.cpp208
-rw-r--r--linden/indra/newview/llviewerdisplayname.h53
-rw-r--r--linden/indra/newview/llviewermedia.cpp4
-rw-r--r--linden/indra/newview/llviewermedia_streamingaudio.cpp10
-rw-r--r--linden/indra/newview/llviewermedia_streamingaudio.h2
-rw-r--r--linden/indra/newview/llviewermenu.cpp32
-rwxr-xr-xlinden/indra/newview/llviewermessage.cpp27
-rw-r--r--linden/indra/newview/llviewerobject.cpp2
-rw-r--r--linden/indra/newview/llviewerparcelmgr.cpp18
-rw-r--r--linden/indra/newview/llviewerprecompiledheaders.h2
-rw-r--r--linden/indra/newview/llviewerregion.cpp17
-rw-r--r--linden/indra/newview/llviewerregion.h6
-rw-r--r--linden/indra/newview/llvoavatar.cpp186
-rw-r--r--linden/indra/newview/llvoavatar.h7
-rw-r--r--linden/indra/newview/llvoiceclient.cpp2
-rw-r--r--linden/indra/newview/llwatchdog.cpp4
-rw-r--r--linden/indra/newview/llwearable.cpp14
-rw-r--r--linden/indra/newview/skins/default/xui/de/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_customize.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml42
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml5
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/mime_types_windows.xml22
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/notifications.xml135
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml5
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml147
-rw-r--r--linden/indra/newview/skins/default/xui/es/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/fr/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/hu/notifications.xml13
-rw-r--r--linden/indra/newview/skins/default/xui/it/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/ja/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/ko/notifications.xml36
-rw-r--r--linden/indra/newview/skins/default/xui/pl/notifications.xml17
-rw-r--r--linden/indra/newview/skins/default/xui/pt/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/ru/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/uk/notifications.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/zh/notifications.xml23
-rw-r--r--linden/indra/test/lltemplatemessagebuilder_tut.cpp2
-rw-r--r--linden/indra/test/message_tut.cpp2
-rw-r--r--linden/indra/test/test.cpp16
-rw-r--r--linden/indra/test_apps/llplugintest/demo_plugin.cpp2
-rw-r--r--linden/indra/test_apps/llplugintest/llmediaplugintest.cpp3
-rw-r--r--linden/indra/win_crash_logger/StdAfx.h2
-rw-r--r--linden/indra/win_crash_logger/llcrashloggerwindows.h2
-rw-r--r--linden/indra/win_updater/updater.cpp2
-rwxr-xr-xlinden/install.xml11
179 files changed, 5273 insertions, 1853 deletions
diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt
index 41f896f..d18b5ba 100644
--- a/linden/doc/contributions.txt
+++ b/linden/doc/contributions.txt
@@ -80,6 +80,7 @@ Aleric Inglewood
80 IMP-578 80 IMP-578
81 IMP-579 81 IMP-579
82 IMP-581 82 IMP-581
83 IMP-590
83 IMP-592 84 IMP-592
84 IMP-595 85 IMP-595
85 IMP-660 86 IMP-660
@@ -91,6 +92,8 @@ Aleric Inglewood
91 IMP-670 92 IMP-670
92 IMP-688 93 IMP-688
93 IMP-692 94 IMP-692
95 IMP-701
96 IMP-712
94Alissa Sabre 97Alissa Sabre
95 VWR-81 98 VWR-81
96 VWR-83 99 VWR-83
@@ -339,6 +342,8 @@ Khyota Wulluf
339Kunnis Basiat 342Kunnis Basiat
340 VWR-82 343 VWR-82
341 VWR-102 344 VWR-102
345Lance Corrimal
346 SNOW-717
342Lisa Lowe 347Lisa Lowe
343 CT-218 348 CT-218
344 CT-219 349 CT-219
diff --git a/linden/etc/message.xml b/linden/etc/message.xml
index 0fdf364..8d34dd8 100644
--- a/linden/etc/message.xml
+++ b/linden/etc/message.xml
@@ -386,7 +386,17 @@
386 <boolean>true</boolean> 386 <boolean>true</boolean>
387 </map> 387 </map>
388 388
389 <key>ParcelVoiceInfo</key> 389 <!-- Server to client -->
390 <key>DisplayNameUpdate</key>
391 <map>
392 <key>flavor</key>
393 <string>llsd</string>
394 <key>trusted-sender</key>
395 <boolean>true</boolean>
396 </map>
397
398
399 <key>ParcelVoiceInfo</key>
390 <map> 400 <map>
391 <key>flavor</key> 401 <key>flavor</key>
392 <string>llsd</string> 402 <string>llsd</string>
@@ -442,6 +452,14 @@
442 <boolean>true</boolean> 452 <boolean>true</boolean>
443 </map> 453 </map>
444 454
455 <key>SetDisplayNameReply</key>
456 <map>
457 <key>flavor</key>
458 <string>llsd</string>
459 <key>trusted-sender</key>
460 <boolean>true</boolean>
461 </map>
462
445 <key>DirLandReply</key> 463 <key>DirLandReply</key>
446 <map> 464 <map>
447 <key>flavor</key> 465 <key>flavor</key>
diff --git a/linden/indra/cmake/Boost.cmake b/linden/indra/cmake/Boost.cmake
index 7741615..665a162 100644
--- a/linden/indra/cmake/Boost.cmake
+++ b/linden/indra/cmake/Boost.cmake
@@ -14,7 +14,7 @@ else (STANDALONE)
14 set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) 14 set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
15 15
16 if (WINDOWS) 16 if (WINDOWS)
17 set(BOOST_VERSION 1_36) 17 set(BOOST_VERSION 1_39)
18 if (MSVC80) 18 if (MSVC80)
19 set(BOOST_PROGRAM_OPTIONS_LIBRARY 19 set(BOOST_PROGRAM_OPTIONS_LIBRARY
20 optimized libboost_program_options-vc80-mt-${BOOST_VERSION} 20 optimized libboost_program_options-vc80-mt-${BOOST_VERSION}
@@ -25,6 +25,8 @@ else (STANDALONE)
25 set(BOOST_SIGNALS_LIBRARY 25 set(BOOST_SIGNALS_LIBRARY
26 optimized libboost_signals-vc80-mt-${BOOST_VERSION} 26 optimized libboost_signals-vc80-mt-${BOOST_VERSION}
27 debug libboost_signals-vc80-mt-gd-${BOOST_VERSION}) 27 debug libboost_signals-vc80-mt-gd-${BOOST_VERSION})
28 # Default support for VS2008 was lost in the move from 1.36 to 1.39.
29 # Remove this comment when this is fixed -- MC
28 elseif (MSVC90) 30 elseif (MSVC90)
29 set(BOOST_PROGRAM_OPTIONS_LIBRARY 31 set(BOOST_PROGRAM_OPTIONS_LIBRARY
30 optimized libboost_program_options-vc90-mt-${BOOST_VERSION} 32 optimized libboost_program_options-vc90-mt-${BOOST_VERSION}
diff --git a/linden/indra/cmake/GStreamer010Plugin.cmake b/linden/indra/cmake/GStreamer010Plugin.cmake
index 90ed35c..ec9b828 100644
--- a/linden/indra/cmake/GStreamer010Plugin.cmake
+++ b/linden/indra/cmake/GStreamer010Plugin.cmake
@@ -15,11 +15,19 @@ else (STANDALONE)
15 use_prebuilt_binary(gstreamer) 15 use_prebuilt_binary(gstreamer)
16 set(GSTREAMER010_FOUND ON FORCE BOOL) 16 set(GSTREAMER010_FOUND ON FORCE BOOL)
17 set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL) 17 set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL)
18 set(GSTREAMER010_INCLUDE_DIRS 18 if (WINDOWS)
19 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/gstreamer-0.10 19 set(GSTREAMER010_INCLUDE_DIRS
20 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0 20 ${LIBS_PREBUILT_DIR}/include/gstreamer-0.10
21 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/libxml2 21 ${LIBS_PREBUILT_DIR}/include/glib
22 ) 22 ${LIBS_PREBUILT_DIR}/include/libxml2
23 )
24 else (WINDOWS)
25 set(GSTREAMER010_INCLUDE_DIRS
26 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/gstreamer-0.10
27 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0
28 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/libxml2
29 )
30 endif (WINDOWS)
23 31
24endif (STANDALONE) 32endif (STANDALONE)
25 33
@@ -27,10 +35,10 @@ if (WINDOWS)
27 # We don't need to explicitly link against gstreamer itself, because 35 # We don't need to explicitly link against gstreamer itself, because
28 # LLMediaImplGStreamer probes for the system's copy at runtime. 36 # LLMediaImplGStreamer probes for the system's copy at runtime.
29 set(GSTREAMER010_LIBRARIES 37 set(GSTREAMER010_LIBRARIES
30 libgstvideo 38 gstaudio-0.10.lib
31 libgstaudio 39 gstbase-0.10.lib
32 libgstbase-0.10 40 gstreamer-0.10.lib
33 libgstreamer-0.10 41 gstvideo-0.10.lib
34 gobject-2.0 42 gobject-2.0
35 gmodule-2.0 43 gmodule-2.0
36 gthread-2.0 44 gthread-2.0
diff --git a/linden/indra/llaudio/llaudioengine.cpp b/linden/indra/llaudio/llaudioengine.cpp
index bed791a..6b0003a 100644
--- a/linden/indra/llaudio/llaudioengine.cpp
+++ b/linden/indra/llaudio/llaudioengine.cpp
@@ -36,7 +36,6 @@
36#include "linden_common.h" 36#include "linden_common.h"
37 37
38#include "llaudioengine.h" 38#include "llaudioengine.h"
39#include "llstreamingaudio.h"
40 39
41#include "llerror.h" 40#include "llerror.h"
42#include "llmath.h" 41#include "llmath.h"
@@ -48,7 +47,6 @@
48#include "llaudiodecodemgr.h" 47#include "llaudiodecodemgr.h"
49#include "llassetstorage.h" 48#include "llassetstorage.h"
50 49
51
52// necessary for grabbing sounds from sim (implemented in viewer) 50// necessary for grabbing sounds from sim (implemented in viewer)
53extern void request_sound(const LLUUID &sound_guid); 51extern void request_sound(const LLUUID &sound_guid);
54 52
@@ -70,16 +68,6 @@ LLAudioEngine::~LLAudioEngine()
70{ 68{
71} 69}
72 70
73LLStreamingAudioInterface* LLAudioEngine::getStreamingAudioImpl()
74{
75 return mStreamingAudioImpl;
76}
77
78void LLAudioEngine::setStreamingAudioImpl(LLStreamingAudioInterface *impl)
79{
80 mStreamingAudioImpl = impl;
81}
82
83void LLAudioEngine::setDefaults() 71void LLAudioEngine::setDefaults()
84{ 72{
85 mMaxWindGain = 1.f; 73 mMaxWindGain = 1.f;
@@ -108,8 +96,6 @@ void LLAudioEngine::setDefaults()
108 mInternalGain = 0.f; 96 mInternalGain = 0.f;
109 mNextWindUpdate = 0.f; 97 mNextWindUpdate = 0.f;
110 98
111 mStreamingAudioImpl = NULL;
112
113 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++) 99 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
114 mSecondaryGain[i] = 1.0f; 100 mSecondaryGain[i] = 1.0f;
115} 101}
@@ -174,62 +160,6 @@ void LLAudioEngine::shutdown()
174 } 160 }
175} 161}
176 162
177
178// virtual
179void LLAudioEngine::startInternetStream(const std::string& url)
180{
181 if (mStreamingAudioImpl)
182 mStreamingAudioImpl->start(url);
183}
184
185
186// virtual
187void LLAudioEngine::stopInternetStream()
188{
189 if (mStreamingAudioImpl)
190 mStreamingAudioImpl->stop();
191}
192
193// virtual
194void LLAudioEngine::pauseInternetStream(int pause)
195{
196 if (mStreamingAudioImpl)
197 mStreamingAudioImpl->pause(pause);
198}
199
200// virtual
201void LLAudioEngine::updateInternetStream()
202{
203 if (mStreamingAudioImpl)
204 mStreamingAudioImpl->update();
205}
206
207// virtual
208int LLAudioEngine::isInternetStreamPlaying()
209{
210 if (mStreamingAudioImpl)
211 return mStreamingAudioImpl->isPlaying();
212
213 return 0; // Stopped
214}
215
216
217// virtual
218void LLAudioEngine::setInternetStreamGain(F32 vol)
219{
220 if (mStreamingAudioImpl)
221 mStreamingAudioImpl->setGain(vol);
222}
223
224// virtual
225std::string LLAudioEngine::getInternetStreamURL()
226{
227 if (mStreamingAudioImpl)
228 return mStreamingAudioImpl->getURL();
229 else return std::string();
230}
231
232
233void LLAudioEngine::updateChannels() 163void LLAudioEngine::updateChannels()
234{ 164{
235 S32 i; 165 S32 i;
@@ -512,7 +442,6 @@ void LLAudioEngine::idle(F32 max_decode_time)
512 // or request new data. 442 // or request new data.
513 startNextTransfer(); 443 startNextTransfer();
514 444
515 updateInternetStream();
516} 445}
517 446
518 447
@@ -754,14 +683,6 @@ F32 LLAudioEngine::getSecondaryGain(S32 type)
754 return mSecondaryGain[type]; 683 return mSecondaryGain[type];
755} 684}
756 685
757F32 LLAudioEngine::getInternetStreamGain()
758{
759 if (mStreamingAudioImpl)
760 return mStreamingAudioImpl->getGain();
761 else
762 return 1.0f;
763}
764
765void LLAudioEngine::setMaxWindGain(F32 gain) 686void LLAudioEngine::setMaxWindGain(F32 gain)
766{ 687{
767 mMaxWindGain = gain; 688 mMaxWindGain = gain;
diff --git a/linden/indra/llaudio/llaudioengine.h b/linden/indra/llaudio/llaudioengine.h
index a1b240e..7237ce2 100644
--- a/linden/indra/llaudio/llaudioengine.h
+++ b/linden/indra/llaudio/llaudioengine.h
@@ -71,8 +71,6 @@ class LLAudioData;
71class LLAudioChannel; 71class LLAudioChannel;
72class LLAudioChannelOpenAL; 72class LLAudioChannelOpenAL;
73class LLAudioBuffer; 73class LLAudioBuffer;
74class LLStreamingAudioInterface;
75
76 74
77// 75//
78// LLAudioEngine definition 76// LLAudioEngine definition
@@ -119,16 +117,13 @@ public:
119 // stops playing new sounds. 117 // stops playing new sounds.
120 void setMuted(bool muted); 118 void setMuted(bool muted);
121 bool getMuted() const { return mMuted; } 119 bool getMuted() const { return mMuted; }
122#ifdef USE_PLUGIN_MEDIA 120
123 LLPluginClassMedia* initializeMedia(const std::string& media_type);
124#endif
125 F32 getMasterGain(); 121 F32 getMasterGain();
126 void setMasterGain(F32 gain); 122 void setMasterGain(F32 gain);
127 123
128 F32 getSecondaryGain(S32 type); 124 F32 getSecondaryGain(S32 type);
129 void setSecondaryGain(S32 type, F32 gain); 125 void setSecondaryGain(S32 type, F32 gain);
130 126
131 F32 getInternetStreamGain();
132 127
133 virtual void setDopplerFactor(F32 factor); 128 virtual void setDopplerFactor(F32 factor);
134 virtual F32 getDopplerFactor(); 129 virtual F32 getDopplerFactor();
@@ -150,19 +145,6 @@ public:
150 LLAudioSource *findAudioSource(const LLUUID &source_id); 145 LLAudioSource *findAudioSource(const LLUUID &source_id);
151 LLAudioData *getAudioData(const LLUUID &audio_uuid); 146 LLAudioData *getAudioData(const LLUUID &audio_uuid);
152 147
153 // Internet stream implementation manipulation
154 LLStreamingAudioInterface *getStreamingAudioImpl();
155 void setStreamingAudioImpl(LLStreamingAudioInterface *impl);
156 // Internet stream methods - these will call down into the *mStreamingAudioImpl if it exists
157 void startInternetStream(const std::string& url);
158 void stopInternetStream();
159 void pauseInternetStream(int pause);
160 void updateInternetStream(); // expected to be called often
161 int isInternetStreamPlaying();
162 // use a value from 0.0 to 1.0, inclusive
163 void setInternetStreamGain(F32 vol);
164 std::string getInternetStreamURL();
165
166 // For debugging usage 148 // For debugging usage
167 virtual LLVector3 getListenerPos(); 149 virtual LLVector3 getListenerPos();
168 150
@@ -247,7 +229,6 @@ protected:
247 229
248private: 230private:
249 void setDefaults(); 231 void setDefaults();
250 LLStreamingAudioInterface *mStreamingAudioImpl;
251}; 232};
252 233
253 234
diff --git a/linden/indra/llaudio/llstreamingaudio.h b/linden/indra/llaudio/llstreamingaudio.h
index aa89e6a..f5d5334 100644
--- a/linden/indra/llaudio/llstreamingaudio.h
+++ b/linden/indra/llaudio/llstreamingaudio.h
@@ -36,7 +36,7 @@
36 36
37#include "stdtypes.h" // from llcommon 37#include "stdtypes.h" // from llcommon
38 38
39// Entirely abstract. Based exactly on the historic API. 39// Entirely abstract. Based on the historic API.
40class LLStreamingAudioInterface 40class LLStreamingAudioInterface
41{ 41{
42 public: 42 public:
@@ -51,6 +51,7 @@ class LLStreamingAudioInterface
51 virtual void setGain(F32 vol) = 0; 51 virtual void setGain(F32 vol) = 0;
52 virtual F32 getGain() = 0; 52 virtual F32 getGain() = 0;
53 virtual std::string getURL() = 0; 53 virtual std::string getURL() = 0;
54 virtual std::string getVersion() = 0;
54}; 55};
55 56
56#endif // LL_STREAMINGAUDIO_H 57#endif // LL_STREAMINGAUDIO_H
diff --git a/linden/indra/llcharacter/llcharacter.cpp b/linden/indra/llcharacter/llcharacter.cpp
index 46ac326..72cef83 100644
--- a/linden/indra/llcharacter/llcharacter.cpp
+++ b/linden/indra/llcharacter/llcharacter.cpp
@@ -379,7 +379,7 @@ void LLCharacter::clearVisualParamWeights()
379 param; 379 param;
380 param = getNextVisualParam()) 380 param = getNextVisualParam())
381 { 381 {
382 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 382 if (param->isTweakable())
383 { 383 {
384 param->setWeight( param->getDefaultWeight(), FALSE ); 384 param->setWeight( param->getDefaultWeight(), FALSE );
385 } 385 }
@@ -395,7 +395,7 @@ BOOL LLCharacter::visualParamWeightsAreDefault()
395 param; 395 param;
396 param = getNextVisualParam()) 396 param = getNextVisualParam())
397 { 397 {
398 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 398 if (param->isTweakable())
399 { 399 {
400 if (param->getWeight() != param->getDefaultWeight()) 400 if (param->getWeight() != param->getDefaultWeight())
401 return false; 401 return false;
diff --git a/linden/indra/llcharacter/llcharacter.h b/linden/indra/llcharacter/llcharacter.h
index d91124b..7630760 100644
--- a/linden/indra/llcharacter/llcharacter.h
+++ b/linden/indra/llcharacter/llcharacter.h
@@ -231,6 +231,20 @@ public:
231 return (mCurIterator++)->second; 231 return (mCurIterator++)->second;
232 } 232 }
233 233
234 S32 getVisualParamCountInGroup(EVisualParamGroup group)
235 {
236 S32 rtn = 0;
237 VisualParamIndexMap_t::iterator iter;
238 for (iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
239 {
240 if (iter->second->getGroup() == group)
241 {
242 rtn++;
243 }
244 }
245 return rtn;
246 }
247
234 LLVisualParam* getVisualParam(S32 id) 248 LLVisualParam* getVisualParam(S32 id)
235 { 249 {
236 VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.find(id); 250 VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.find(id);
diff --git a/linden/indra/llcharacter/llvisualparam.cpp b/linden/indra/llcharacter/llvisualparam.cpp
index d7a144e..9579ff8 100644
--- a/linden/indra/llcharacter/llvisualparam.cpp
+++ b/linden/indra/llcharacter/llvisualparam.cpp
@@ -238,7 +238,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
238{ 238{
239 if (mInfo) 239 if (mInfo)
240 { 240 {
241 if (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 241 if (isTweakable())
242 { 242 {
243 mTargetWeight = llclamp(target_value, mInfo->mMinWeight, mInfo->mMaxWeight); 243 mTargetWeight = llclamp(target_value, mInfo->mMinWeight, mInfo->mMaxWeight);
244 } 244 }
@@ -282,7 +282,7 @@ void LLVisualParam::animate( F32 delta, BOOL set_by_user )
282//----------------------------------------------------------------------------- 282//-----------------------------------------------------------------------------
283void LLVisualParam::stopAnimating(BOOL set_by_user) 283void LLVisualParam::stopAnimating(BOOL set_by_user)
284{ 284{
285 if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 285 if (mIsAnimating && isTweakable())
286 { 286 {
287 mIsAnimating = FALSE; 287 mIsAnimating = FALSE;
288 setWeight(mTargetWeight, set_by_user); 288 setWeight(mTargetWeight, set_by_user);
diff --git a/linden/indra/llcharacter/llvisualparam.h b/linden/indra/llcharacter/llvisualparam.h
index 3a0c1bb..d8dff8c 100644
--- a/linden/indra/llcharacter/llvisualparam.h
+++ b/linden/indra/llcharacter/llvisualparam.h
@@ -51,6 +51,7 @@ enum EVisualParamGroup
51{ 51{
52 VISUAL_PARAM_GROUP_TWEAKABLE, 52 VISUAL_PARAM_GROUP_TWEAKABLE,
53 VISUAL_PARAM_GROUP_ANIMATABLE, 53 VISUAL_PARAM_GROUP_ANIMATABLE,
54 VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT,
54 NUM_VISUAL_PARAM_GROUPS 55 NUM_VISUAL_PARAM_GROUPS
55}; 56};
56 57
@@ -124,7 +125,7 @@ public:
124 void setMaxDisplayName(const std::string& s) { mInfo->mMaxName = s; } 125 void setMaxDisplayName(const std::string& s) { mInfo->mMaxName = s; }
125 void setMinDisplayName(const std::string& s) { mInfo->mMinName = s; } 126 void setMinDisplayName(const std::string& s) { mInfo->mMinName = s; }
126 127
127 EVisualParamGroup getGroup() { return mInfo->mGroup; } 128 EVisualParamGroup getGroup() const { return mInfo->mGroup; }
128 F32 getMinWeight() { return mInfo->mMinWeight; } 129 F32 getMinWeight() { return mInfo->mMinWeight; }
129 F32 getMaxWeight() { return mInfo->mMaxWeight; } 130 F32 getMaxWeight() { return mInfo->mMaxWeight; }
130 F32 getDefaultWeight() { return mInfo->mDefaultWeight; } 131 F32 getDefaultWeight() { return mInfo->mDefaultWeight; }
@@ -133,7 +134,8 @@ public:
133 F32 getWeight() { return mIsAnimating ? mTargetWeight : mCurWeight; } 134 F32 getWeight() { return mIsAnimating ? mTargetWeight : mCurWeight; }
134 F32 getCurrentWeight() { return mCurWeight; } 135 F32 getCurrentWeight() { return mCurWeight; }
135 F32 getLastWeight() { return mLastWeight; } 136 F32 getLastWeight() { return mLastWeight; }
136 BOOL isAnimating() { return mIsAnimating; } 137 BOOL isAnimating() { return mIsAnimating; }
138 BOOL isTweakable() { return (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) || (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT); }
137 139
138 LLVisualParam* getNextParam() { return mNext; } 140 LLVisualParam* getNextParam() { return mNext; }
139 void setNextParam( LLVisualParam *next ); 141 void setNextParam( LLVisualParam *next );
@@ -141,6 +143,7 @@ public:
141 virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating; } 143 virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating; }
142 BOOL getAnimating() { return mIsAnimating; } 144 BOOL getAnimating() { return mIsAnimating; }
143 145
146
144protected: 147protected:
145 F32 mCurWeight; // current weight 148 F32 mCurWeight; // current weight
146 F32 mLastWeight; // last weight 149 F32 mLastWeight; // last weight
diff --git a/linden/indra/llcommon/CMakeLists.txt b/linden/indra/llcommon/CMakeLists.txt
index ff1d548..ed04ca6 100644
--- a/linden/indra/llcommon/CMakeLists.txt
+++ b/linden/indra/llcommon/CMakeLists.txt
@@ -13,11 +13,13 @@ include_directories(
13 ) 13 )
14 14
15set(llcommon_SOURCE_FILES 15set(llcommon_SOURCE_FILES
16 aiaprpool.cpp
16 imageids.cpp 17 imageids.cpp
17 indra_constants.cpp 18 indra_constants.cpp
18 llapp.cpp 19 llapp.cpp
19 llapr.cpp 20 llapr.cpp
20 llassettype.cpp 21 llassettype.cpp
22 llavatarname.cpp
21 llbase32.cpp 23 llbase32.cpp
22 llbase64.cpp 24 llbase64.cpp
23 llcommon.cpp 25 llcommon.cpp
@@ -74,6 +76,8 @@ set(llcommon_SOURCE_FILES
74set(llcommon_HEADER_FILES 76set(llcommon_HEADER_FILES
75 CMakeLists.txt 77 CMakeLists.txt
76 78
79 aiaprpool.h
80 aithreadsafe.h
77 bitpack.h 81 bitpack.h
78 ctype_workaround.h 82 ctype_workaround.h
79 doublelinkedlist.h 83 doublelinkedlist.h
@@ -87,6 +91,7 @@ set(llcommon_HEADER_FILES
87 llassettype.h 91 llassettype.h
88 llassoclist.h 92 llassoclist.h
89 llavatarconstants.h 93 llavatarconstants.h
94 llavatarname.h
90 llbase32.h 95 llbase32.h
91 llbase64.h 96 llbase64.h
92 llboost.h 97 llboost.h
@@ -147,6 +152,7 @@ set(llcommon_HEADER_FILES
147 llqueuedthread.h 152 llqueuedthread.h
148 llrand.h 153 llrand.h
149 llrun.h 154 llrun.h
155 llscopedvolatileaprpool.h
150 llsd.h 156 llsd.h
151 llsdserialize.h 157 llsdserialize.h
152 llsdserialize_xml.h 158 llsdserialize_xml.h
diff --git a/linden/indra/llcommon/aiaprpool.cpp b/linden/indra/llcommon/aiaprpool.cpp
new file mode 100644
index 0000000..d3748e9
--- /dev/null
+++ b/linden/indra/llcommon/aiaprpool.cpp
@@ -0,0 +1,198 @@
1/**
2 * @file aiaprpool.cpp
3 *
4 * Copyright (c) 2010, Aleric Inglewood.
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * There are special exceptions to the terms and conditions of the GPL as
20 * it is applied to this Source Code. View the full text of the exception
21 * in the file doc/FLOSS-exception.txt in this software distribution.
22 *
23 * CHANGELOG
24 * and additional copyright holders.
25 *
26 * 04/04/2010
27 * - Initial version, written by Aleric Inglewood @ SL
28 *
29 * 10/11/2010
30 * - Changed filename, class names and license to a more
31 * company-neutral format.
32 * - Added APR_HAS_THREADS #if's to allow creation and destruction
33 * of subpools by threads other than the parent pool owner.
34 */
35
36#include "linden_common.h"
37
38#include "llerror.h"
39#include "aiaprpool.h"
40#include "llthread.h"
41
42// Create a subpool from parent.
43void AIAPRPool::create(AIAPRPool& parent)
44{
45 llassert(!mPool); // Must be non-initialized.
46 mParent = &parent;
47 if (!mParent) // Using the default parameter?
48 {
49 // By default use the root pool of the current thread.
50 mParent = &AIThreadLocalData::tldata().mRootPool;
51 }
52 llassert(mParent->mPool); // Parent must be initialized.
53#if APR_HAS_THREADS
54 // As per the documentation of APR (ie http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html):
55 //
56 // Note that most operations on pools are not thread-safe: a single pool should only be
57 // accessed by a single thread at any given time. The one exception to this rule is creating
58 // a subpool of a given pool: one or more threads can safely create subpools at the same
59 // time that another thread accesses the parent pool.
60 //
61 // In other words, it's safe for any thread to create a (sub)pool, independent of who
62 // owns the parent pool.
63 mOwner = apr_os_thread_current();
64#else
65 mOwner = mParent->mOwner;
66 llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
67#endif
68 apr_status_t const apr_pool_create_status = apr_pool_create(&mPool, mParent->mPool);
69 llassert_always(apr_pool_create_status == APR_SUCCESS);
70 llassert(mPool); // Initialized.
71 apr_pool_cleanup_register(mPool, this, &s_plain_cleanup, &apr_pool_cleanup_null);
72}
73
74// Destroy the (sub)pool, if any.
75void AIAPRPool::destroy(void)
76{
77 // Only do anything if we are not already (being) destroyed.
78 if (mPool)
79 {
80#if !APR_HAS_THREADS
81 // If we are a root pool, then every thread may destruct us: in that case
82 // we have to assume that no other thread will use this pool concurrently,
83 // of course. Otherwise, if we are a subpool, only the thread that owns
84 // the parent may destruct us, since that is the pool that is still alive,
85 // possibly being used by others and being altered here.
86 llassert(!mParent || apr_os_thread_equal(mParent->mOwner, apr_os_thread_current()));
87#endif
88 apr_pool_t* pool = mPool;
89 mPool = NULL; // Mark that we are BEING destructed.
90 apr_pool_cleanup_kill(pool, this, &s_plain_cleanup);
91 apr_pool_destroy(pool);
92 }
93}
94
95bool AIAPRPool::parent_is_being_destructed(void)
96{
97 return mParent && (!mParent->mPool || mParent->parent_is_being_destructed());
98}
99
100AIAPRInitialization::AIAPRInitialization(void)
101{
102 static bool apr_initialized = false;
103
104 if (!apr_initialized)
105 {
106 apr_initialize();
107 }
108
109 apr_initialized = true;
110}
111
112bool AIAPRRootPool::sCountInitialized = false;
113apr_uint32_t volatile AIAPRRootPool::sCount;
114
115extern apr_thread_mutex_t* gLogMutexp;
116extern apr_thread_mutex_t* gCallStacksLogMutexp;
117
118AIAPRRootPool::AIAPRRootPool(void) : AIAPRInitialization(), AIAPRPool(0)
119{
120 // sCountInitialized don't need locking because when we get here there is still only a single thread.
121 if (!sCountInitialized)
122 {
123 // Initialize the logging mutex
124 apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, mPool);
125 apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, mPool);
126
127 apr_status_t status = apr_atomic_init(mPool);
128 llassert_always(status == APR_SUCCESS);
129 apr_atomic_set32(&sCount, 1); // Set to 1 to account for the global root pool.
130 sCountInitialized = true;
131
132 // Initialize thread-local APR pool support.
133 // Because this recursively calls AIAPRRootPool::AIAPRRootPool(void)
134 // it must be done last, so that sCount is already initialized.
135 AIThreadLocalData::init();
136 }
137 apr_atomic_inc32(&sCount);
138}
139
140AIAPRRootPool::~AIAPRRootPool()
141{
142 if (!apr_atomic_dec32(&sCount))
143 {
144 // The last pool was destructed. Cleanup remainder of APR.
145 LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL;
146
147 if (gLogMutexp)
148 {
149 // Clean up the logging mutex
150
151 // All other threads NEED to be done before we clean up APR, so this is okay.
152 apr_thread_mutex_destroy(gLogMutexp);
153 gLogMutexp = NULL;
154 }
155 if (gCallStacksLogMutexp)
156 {
157 // Clean up the logging mutex
158
159 // All other threads NEED to be done before we clean up APR, so this is okay.
160 apr_thread_mutex_destroy(gCallStacksLogMutexp);
161 gCallStacksLogMutexp = NULL;
162 }
163
164 // Must destroy ALL, and therefore this last AIAPRRootPool, before terminating APR.
165 static_cast<AIAPRRootPool*>(this)->destroy();
166
167 apr_terminate();
168 }
169}
170
171//static
172AIAPRRootPool& AIAPRRootPool::get(void)
173{
174 static AIAPRRootPool global_APRpool(0); // This is what used to be gAPRPoolp.
175 return global_APRpool;
176}
177
178void AIVolatileAPRPool::clearVolatileAPRPool()
179{
180 llassert_always(mNumActiveRef > 0);
181 if (--mNumActiveRef == 0)
182 {
183 if (isOld())
184 {
185 destroy();
186 mNumTotalRef = 0 ;
187 }
188 else
189 {
190 // This does not actually free the memory,
191 // it just allows the pool to re-use this memory for the next allocation.
192 clear();
193 }
194 }
195
196 // Paranoia check if the pool is jammed.
197 llassert(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ;
198}
diff --git a/linden/indra/llcommon/aiaprpool.h b/linden/indra/llcommon/aiaprpool.h
new file mode 100644
index 0000000..ac523a9
--- /dev/null
+++ b/linden/indra/llcommon/aiaprpool.h
@@ -0,0 +1,240 @@
1/**
2 * @file aiaprpool.h
3 * @brief Implementation of AIAPRPool.
4 *
5 * Copyright (c) 2010, Aleric Inglewood.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 * There are special exceptions to the terms and conditions of the GPL as
21 * it is applied to this Source Code. View the full text of the exception
22 * in the file doc/FLOSS-exception.txt in this software distribution.
23 *
24 * CHANGELOG
25 * and additional copyright holders.
26 *
27 * 04/04/2010
28 * - Initial version, written by Aleric Inglewood @ SL
29 *
30 * 10/11/2010
31 * - Changed filename, class names and license to a more
32 * company-neutral format.
33 * - Added APR_HAS_THREADS #if's to allow creation and destruction
34 * of subpools by threads other than the parent pool owner.
35 */
36
37#ifndef AIAPRPOOL_H
38#define AIAPRPOOL_H
39
40#ifdef LL_WINDOWS
41//#include <ws2tcpip.h>
42# define WIN32_LEAN_AND_MEAN
43# include <winsock2.h> // Needed before including apr_portable.h
44#endif
45
46#include "apr_portable.h"
47#include "apr_pools.h"
48#include "llerror.h"
49
50extern void ll_init_apr();
51
52/**
53 * @brief A wrapper around the APR memory pool API.
54 *
55 * Usage of this class should be restricted to passing it to libapr-1 function calls that need it.
56 *
57 */
58class LL_COMMON_API AIAPRPool
59{
60protected:
61 apr_pool_t* mPool; //!< Pointer to the underlaying pool. NULL if not initialized.
62 AIAPRPool* mParent; //!< Pointer to the parent pool, if any. Only valid when mPool is non-zero.
63 apr_os_thread_t mOwner; //!< The thread that owns this memory pool. Only valid when mPool is non-zero.
64
65public:
66 //! Construct an uninitialized (destructed) pool.
67 AIAPRPool(void) : mPool(NULL) { }
68
69 //! Construct a subpool from an existing pool.
70 // This is not a copy-constructor, this class doesn't have one!
71 AIAPRPool(AIAPRPool& parent) : mPool(NULL) { create(parent); }
72
73 //! Destruct the memory pool (free all of it's subpools and allocated memory).
74 ~AIAPRPool() { destroy(); }
75
76protected:
77 // Create a pool that is allocated from the Operating System. Only used by AIAPRRootPool.
78 AIAPRPool(int) : mPool(NULL), mParent(NULL), mOwner(apr_os_thread_current())
79 {
80 apr_status_t const apr_pool_create_status = apr_pool_create(&mPool, NULL);
81 llassert_always(apr_pool_create_status == APR_SUCCESS);
82 llassert(mPool);
83 apr_pool_cleanup_register(mPool, this, &s_plain_cleanup, &apr_pool_cleanup_null);
84 }
85
86public:
87 //! Create a subpool from parent. May only be called for an uninitialized/destroyed pool.
88 // The default parameter causes the root pool of the current thread to be used.
89 void create(AIAPRPool& parent = *static_cast<AIAPRPool*>(NULL));
90
91 //! Destroy the (sub)pool, if any.
92 void destroy(void);
93
94 // Use some safebool idiom (http://www.artima.com/cppsource/safebool.html) rather than operator bool.
95 typedef apr_pool_t* const AIAPRPool::* const bool_type;
96 //! Return true if the pool is initialized.
97 operator bool_type() const { return mPool ? &AIAPRPool::mPool : 0; }
98
99 // Painful, but we have to either provide access to this, or wrap
100 // every APR function call that needs a apr_pool_t* to be passed.
101 // NEVER destroy a pool that is returned by this function!
102 apr_pool_t* operator()(void) const
103 {
104 llassert(mPool);
105 llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
106 return mPool;
107 }
108
109 // Free all memory without destructing the pool.
110 void clear(void)
111 {
112 llassert(mPool);
113 llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
114 apr_pool_clear(mPool);
115 }
116
117// These methods would make this class 'complete' (as wrapper around the libapr
118// pool functions), but we don't use memory pools in the viewer (only when
119// we are forced to pass one to a libapr call), so don't define them in order
120// not to encourage people to use them.
121#if 0
122 void* palloc(size_t size)
123 {
124 llassert(mPool);
125 llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
126 return apr_palloc(mPool, size);
127 }
128 void* pcalloc(size_t size)
129 {
130 llassert(mPool);
131 llassert(apr_os_thread_equal(mOwner, apr_os_thread_current()));
132 return apr_pcalloc(mPool, size);
133 }
134#endif
135
136private:
137 bool parent_is_being_destructed(void);
138 static apr_status_t s_plain_cleanup(void* userdata) { return static_cast<AIAPRPool*>(userdata)->plain_cleanup(); }
139
140 apr_status_t plain_cleanup(void)
141 {
142 if (mPool && // We are not being destructed,
143 parent_is_being_destructed()) // but our parent is.
144 // This means the pool is being destructed recursively by libapr
145 // because one of it's parents is being destructed.
146 {
147 mPool = NULL; // Stop destroy() from destructing the pool again.
148 }
149 return APR_SUCCESS;
150 }
151};
152
153class AIAPRInitialization
154{
155public:
156 AIAPRInitialization(void);
157};
158
159/**
160 * @brief Root memory pool (allocates memory from the operating system).
161 *
162 * This class should only be used by AIThreadLocalData and AIThreadSafeSimpleDCRootPool_pbase
163 * (and LLMutexRootPool when APR_HAS_THREADS isn't defined).
164 */
165class LL_COMMON_API AIAPRRootPool : public AIAPRInitialization, public AIAPRPool
166{
167private:
168 friend class AIThreadLocalData;
169 friend class AIThreadSafeSimpleDCRootPool_pbase;
170#if !APR_HAS_THREADS
171 friend class LLMutexRootPool;
172#endif
173 //! Construct a root memory pool.
174 // Should only be used by AIThreadLocalData and AIThreadSafeSimpleDCRootPool_pbase.
175 AIAPRRootPool(void);
176 ~AIAPRRootPool();
177
178private:
179 // Keep track of how many root pools exist and when the last one is destructed.
180 static bool sCountInitialized;
181 static apr_uint32_t volatile sCount;
182
183public:
184 // Return a global root pool that is independent of AIThreadLocalData.
185 // Normally you should not use this. Only use for early initialization
186 // (before main) and deinitialization (after main).
187 static AIAPRRootPool& get(void);
188
189#if APR_POOL_DEBUG
190 void grab_ownership(void)
191 {
192 // You need a patched libapr to use this.
193 // See http://web.archiveorange.com/archive/v/5XO9y2zoxUOMt6Gmi1OI
194 apr_pool_owner_set(mPool);
195 }
196#endif
197
198private:
199 // Used for constructing the Special Global Root Pool (returned by AIAPRRootPool::get).
200 // It is the same as the default constructor but omits to increment sCount. As a result,
201 // we must be sure that at least one other AIAPRRootPool is created before termination
202 // of the application (which is the case: we create one AIAPRRootPool per thread).
203 AIAPRRootPool(int) : AIAPRInitialization(), AIAPRPool(0) { }
204};
205
206//! Volatile memory pool
207//
208// 'Volatile' APR memory pool which normally only clears memory,
209// and does not destroy the pool (the same pool is reused) for
210// greater efficiency. However, as a safe guard the apr pool
211// is destructed every FULL_VOLATILE_APR_POOL uses to allow
212// the system memory to be allocated more efficiently and not
213// get scattered through RAM.
214//
215class LL_COMMON_API AIVolatileAPRPool : protected AIAPRPool
216{
217public:
218 AIVolatileAPRPool(void) : mNumActiveRef(0), mNumTotalRef(0) { }
219
220 apr_pool_t* getVolatileAPRPool(void)
221 {
222 if (!mPool) create();
223 ++mNumActiveRef;
224 ++mNumTotalRef;
225 return AIAPRPool::operator()();
226 }
227 void clearVolatileAPRPool(void);
228
229 bool isOld(void) const { return mNumTotalRef > FULL_VOLATILE_APR_POOL; }
230 bool isUnused() const { return mNumActiveRef == 0; }
231
232private:
233 S32 mNumActiveRef; // Number of active uses of the pool.
234 S32 mNumTotalRef; // Number of total uses of the pool since last creation.
235
236 // Maximum number of references to AIVolatileAPRPool until the pool is recreated.
237 static S32 const FULL_VOLATILE_APR_POOL = 1024;
238};
239
240#endif // AIAPRPOOL_H
diff --git a/linden/indra/llcommon/aithreadsafe.h b/linden/indra/llcommon/aithreadsafe.h
new file mode 100644
index 0000000..e1b93ba
--- /dev/null
+++ b/linden/indra/llcommon/aithreadsafe.h
@@ -0,0 +1,463 @@
1/**
2 * @file aithreadsafe.h
3 * @brief Implementation of AIThreadSafe, AIReadAccessConst, AIReadAccess and AIWriteAccess.
4 *
5 * CHANGELOG
6 * and additional copyright holders.
7 *
8 * 31/03/2010
9 * Initial version, written by Aleric Inglewood @ SL
10 */
11
12#ifndef AITHREADSAFE_H
13#define AITHREADSAFE_H
14
15#include <new>
16
17#include "llthread.h"
18#include "llerror.h"
19
20template<typename T> struct AIReadAccessConst;
21template<typename T> struct AIReadAccess;
22template<typename T> struct AIWriteAccess;
23template<typename T> struct AIAccess;
24
25template<typename T>
26class AIThreadSafeBits
27{
28private:
29 // AIThreadSafe is a wrapper around an instance of T.
30 // Because T might not have a default constructor, it is constructed
31 // 'in place', with placement new, in the memory reserved here.
32 //
33 // Make sure that the memory that T will be placed in is properly
34 // aligned by using an array of long's.
35 long mMemory[(sizeof(T) + sizeof(long) - 1) / sizeof(long)];
36
37public:
38 // The wrapped objects are constructed in-place with placement new *outside*
39 // of this object (by AITHREADSAFE macro(s) or derived classes).
40 // However, we are responsible for the destruction of the wrapped object.
41 ~AIThreadSafeBits() { ptr()->~T(); }
42
43 // Only for use by AITHREADSAFE, see below.
44 void* memory() const { return const_cast<long*>(&mMemory[0]); }
45
46protected:
47 // Accessors.
48 T const* ptr() const { return reinterpret_cast<T const*>(mMemory); }
49 T* ptr() { return reinterpret_cast<T*>(mMemory); }
50};
51
52/**
53 * @brief A wrapper class for objects that need to be accessed by more than one thread, allowing concurrent readers.
54 *
55 * Use AITHREADSAFE to define instances of any type, and use AIReadAccessConst,
56 * AIReadAccess and AIWriteAccess to get access to the instance.
57 *
58 * For example,
59 *
60 * <code>
61 * class Foo { public: Foo(int, int); };
62 *
63 * AITHREADSAFE(Foo, foo, (2, 3));
64 *
65 * AIReadAccess<Foo> foo_r(foo);
66 * // Use foo_r-> for read access.
67 *
68 * AIWriteAccess<Foo> foo_w(foo);
69 * // Use foo_w-> for write access.
70 * </code>
71 *
72 * If <code>foo</code> is constant, you have to use <code>AIReadAccessConst<Foo></code>.
73 *
74 * It is possible to pass access objects to a function that
75 * downgrades the access, for example:
76 *
77 * <code>
78 * void readfunc(AIReadAccess const& access);
79 *
80 * AIWriteAccess<Foo> foo_w(foo);
81 * readfunc(foo_w); // readfunc will perform read access to foo_w.
82 * </code>
83 *
84 * If <code>AIReadAccess</code> is non-const, you can upgrade the access by creating
85 * an <code>AIWriteAccess</code> object from it. For example:
86 *
87 * <code>
88 * AIWriteAccess<Foo> foo_w(foo_r);
89 * </code>
90 *
91 * This API is Robust(tm). If you try anything that could result in problems,
92 * it simply won't compile. The only mistake you can still easily make is
93 * to obtain write access to an object when it is not needed, or to unlock
94 * an object in between accesses while the state of the object should be
95 * preserved. For example:
96 *
97 * <code>
98 * // This resets foo to point to the first file and then returns that.
99 * std::string filename = AIWriteAccess<Foo>(foo)->get_first_filename();
100 *
101 * // WRONG! The state between calling get_first_filename and get_next_filename should be preserved!
102 *
103 * AIWriteAccess<Foo> foo_w(foo); // Wrong. The code below only needs read-access.
104 * while (!filename.empty())
105 * {
106 * something(filename);
107 * filename = foo_w->next_filename();
108 * }
109 * </code>
110 *
111 * Correct would be
112 *
113 * <code>
114 * AIReadAccess<Foo> foo_r(foo);
115 * std::string filename = AIWriteAccess<Foo>(foo_r)->get_first_filename();
116 * while (!filename.empty())
117 * {
118 * something(filename);
119 * filename = foo_r->next_filename();
120 * }
121 * </code>
122 *
123 */
124template<typename T>
125class AIThreadSafe : public AIThreadSafeBits<T>
126{
127protected:
128 // Only these may access the object (through ptr()).
129 friend struct AIReadAccessConst<T>;
130 friend struct AIReadAccess<T>;
131 friend struct AIWriteAccess<T>;
132
133 // Locking control.
134 AIRWLock mRWLock;
135
136 // For use by AIThreadSafeDC
137 AIThreadSafe(void) { }
138 AIThreadSafe(AIAPRPool& parent) : mRWLock(parent) { }
139
140public:
141 // Only for use by AITHREADSAFE, see below.
142 AIThreadSafe(T* object) { llassert(object == AIThreadSafeBits<T>::ptr()); }
143};
144
145/**
146 * @brief Instantiate an static, global or local object of a given type wrapped in AIThreadSafe, using an arbitrary constructor.
147 *
148 * For example, instead of doing
149 *
150 * <code>
151 * Foo foo(x, y);
152 * static Bar bar;
153 * </code>
154 *
155 * One can instantiate a thread-safe instance with
156 *
157 * <code>
158 * AITHREADSAFE(Foo, foo, (x, y));
159 * static AITHREADSAFE(Bar, bar, );
160 * </code>
161 *
162 * Note: This macro does not allow to allocate such object on the heap.
163 * If that is needed, have a look at AIThreadSafeDC.
164 */
165#define AITHREADSAFE(type, var, paramlist) AIThreadSafe<type> var(new (var.memory()) type paramlist)
166
167/**
168 * @brief A wrapper class for objects that need to be accessed by more than one thread.
169 *
170 * This class is the same as an AIThreadSafe wrapper, except that it can only
171 * be used for default constructed objects.
172 *
173 * For example, instead of
174 *
175 * <code>
176 * Foo foo;
177 * </code>
178 *
179 * One would use
180 *
181 * <code>
182 * AIThreadSafeDC<Foo> foo;
183 * </code>
184 *
185 * The advantage over AITHREADSAFE is that this object can be allocated with
186 * new on the heap. For example:
187 *
188 * <code>
189 * AIThreadSafeDC<Foo>* ptr = new AIThreadSafeDC<Foo>;
190 * </code>
191 *
192 * which is not possible with AITHREADSAFE.
193 */
194template<typename T>
195class AIThreadSafeDC : public AIThreadSafe<T>
196{
197public:
198 // Construct a wrapper around a default constructed object.
199 AIThreadSafeDC(void) { new (AIThreadSafe<T>::ptr()) T; }
200};
201
202/**
203 * @brief Read lock object and provide read access.
204 */
205template<typename T>
206struct AIReadAccessConst
207{
208 //! Internal enum for the lock-type of the AI*Access object.
209 enum state_type
210 {
211 readlocked, //!< A AIReadAccessConst or AIReadAccess.
212 read2writelocked, //!< A AIWriteAccess constructed from a AIReadAccess.
213 writelocked, //!< A AIWriteAccess constructed from a AIThreadSafe.
214 write2writelocked //!< A AIWriteAccess constructed from (the AIReadAccess base class of) a AIWriteAccess.
215 };
216
217 //! Construct a AIReadAccessConst from a constant AIThreadSafe.
218 AIReadAccessConst(AIThreadSafe<T> const& wrapper)
219 : mWrapper(const_cast<AIThreadSafe<T>&>(wrapper)),
220 mState(readlocked)
221 {
222 mWrapper.mRWLock.rdlock();
223 }
224
225 //! Destruct the AI*Access object.
226 // These should never be dynamically allocated, so there is no need to make this virtual.
227 ~AIReadAccessConst()
228 {
229 if (mState == readlocked)
230 mWrapper.mRWLock.rdunlock();
231 else if (mState == writelocked)
232 mWrapper.mRWLock.wrunlock();
233 else if (mState == read2writelocked)
234 mWrapper.mRWLock.wr2rdlock();
235 }
236
237 //! Access the underlaying object for read access.
238 T const* operator->() const { return mWrapper.ptr(); }
239
240 //! Access the underlaying object for read access.
241 T const& operator*() const { return *mWrapper.ptr(); }
242
243protected:
244 //! Constructor used by AIReadAccess.
245 AIReadAccessConst(AIThreadSafe<T>& wrapper, state_type state)
246 : mWrapper(wrapper), mState(state) { }
247
248 AIThreadSafe<T>& mWrapper; //!< Reference to the object that we provide access to.
249 state_type const mState; //!< The lock state that mWrapper is in.
250
251private:
252 // Disallow copy constructing directly.
253 AIReadAccessConst(AIReadAccessConst const&);
254};
255
256/**
257 * @brief Read lock object and provide read access, with possible promotion to write access.
258 */
259template<typename T>
260struct AIReadAccess : public AIReadAccessConst<T>
261{
262 typedef typename AIReadAccessConst<T>::state_type state_type;
263 using AIReadAccessConst<T>::readlocked;
264
265 //! Construct a AIReadAccess from a non-constant AIThreadSafe.
266 AIReadAccess(AIThreadSafe<T>& wrapper) : AIReadAccessConst<T>(wrapper, readlocked) { this->mWrapper.mRWLock.rdlock(); }
267
268protected:
269 //! Constructor used by AIWriteAccess.
270 AIReadAccess(AIThreadSafe<T>& wrapper, state_type state) : AIReadAccessConst<T>(wrapper, state) { }
271
272 friend class AIWriteAccess<T>;
273};
274
275/**
276 * @brief Write lock object and provide read/write access.
277 */
278template<typename T>
279struct AIWriteAccess : public AIReadAccess<T>
280{
281 using AIReadAccessConst<T>::readlocked;
282 using AIReadAccessConst<T>::read2writelocked;
283 using AIReadAccessConst<T>::writelocked;
284 using AIReadAccessConst<T>::write2writelocked;
285
286 //! Construct a AIWriteAccess from a non-constant AIThreadSafe.
287 AIWriteAccess(AIThreadSafe<T>& wrapper) : AIReadAccess<T>(wrapper, writelocked) { this->mWrapper.mRWLock.wrlock();}
288
289 //! Promote read access to write access.
290 explicit AIWriteAccess(AIReadAccess<T>& access)
291 : AIReadAccess<T>(access.mWrapper, (access.mState == readlocked) ? read2writelocked : write2writelocked)
292 {
293 if (this->mState == read2writelocked)
294 {
295 this->mWrapper.mRWLock.rd2wrlock();
296 }
297 }
298
299 //! Access the underlaying object for (read and) write access.
300 T* operator->() const { return this->mWrapper.ptr(); }
301
302 //! Access the underlaying object for (read and) write access.
303 T& operator*() const { return *this->mWrapper.ptr(); }
304};
305
306/**
307 * @brief A wrapper class for objects that need to be accessed by more than one thread.
308 *
309 * Use AITHREADSAFESIMPLE to define instances of any type, and use AIAccess
310 * to get access to the instance.
311 *
312 * For example,
313 *
314 * <code>
315 * class Foo { public: Foo(int, int); };
316 *
317 * AITHREADSAFESIMPLE(Foo, foo, (2, 3));
318 *
319 * AIAccess<Foo> foo_w(foo);
320 * // Use foo_w-> for read and write access.
321 *
322 * See also AIThreadSafe
323 */
324template<typename T>
325class AIThreadSafeSimple : public AIThreadSafeBits<T>
326{
327protected:
328 // Only this one may access the object (through ptr()).
329 friend struct AIAccess<T>;
330
331 // Locking control.
332 LLMutex mMutex;
333
334 // For use by AIThreadSafeSimpleDC
335 AIThreadSafeSimple(void) { }
336 AIThreadSafeSimple(AIAPRPool& parent) : mMutex(parent) { }
337
338public:
339 // Only for use by AITHREADSAFESIMPLE, see below.
340 AIThreadSafeSimple(T* object) { llassert(object == AIThreadSafeBits<T>::ptr()); }
341};
342
343/**
344 * @brief Instantiate an static, global or local object of a given type wrapped in AIThreadSafeSimple, using an arbitrary constructor.
345 *
346 * For example, instead of doing
347 *
348 * <code>
349 * Foo foo(x, y);
350 * static Bar bar;
351 * </code>
352 *
353 * One can instantiate a thread-safe instance with
354 *
355 * <code>
356 * AITHREADSAFESIMPLE(Foo, foo, (x, y));
357 * static AITHREADSAFESIMPLE(Bar, bar, );
358 * </code>
359 *
360 * Note: This macro does not allow to allocate such object on the heap.
361 * If that is needed, have a look at AIThreadSafeSimpleDC.
362 */
363#define AITHREADSAFESIMPLE(type, var, paramlist) AIThreadSafeSimple<type> var(new (var.memory()) type paramlist)
364
365/**
366 * @brief A wrapper class for objects that need to be accessed by more than one thread.
367 *
368 * This class is the same as an AIThreadSafeSimple wrapper, except that it can only
369 * be used for default constructed objects.
370 *
371 * For example, instead of
372 *
373 * <code>
374 * Foo foo;
375 * </code>
376 *
377 * One would use
378 *
379 * <code>
380 * AIThreadSafeSimpleDC<Foo> foo;
381 * </code>
382 *
383 * The advantage over AITHREADSAFESIMPLE is that this object can be allocated with
384 * new on the heap. For example:
385 *
386 * <code>
387 * AIThreadSafeSimpleDC<Foo>* ptr = new AIThreadSafeSimpleDC<Foo>;
388 * </code>
389 *
390 * which is not possible with AITHREADSAFESIMPLE.
391 */
392template<typename T>
393class AIThreadSafeSimpleDC : public AIThreadSafeSimple<T>
394{
395public:
396 // Construct a wrapper around a default constructed object.
397 AIThreadSafeSimpleDC(void) { new (AIThreadSafeSimple<T>::ptr()) T; }
398
399protected:
400 // For use by AIThreadSafeSimpleDCRootPool
401 AIThreadSafeSimpleDC(AIAPRPool& parent) : AIThreadSafeSimple<T>(parent) { new (AIThreadSafeSimple<T>::ptr()) T; }
402};
403
404// Helper class for AIThreadSafeSimpleDCRootPool to assure initialization of
405// the root pool before constructing AIThreadSafeSimpleDC.
406class AIThreadSafeSimpleDCRootPool_pbase
407{
408protected:
409 AIAPRRootPool mRootPool;
410
411private:
412 template<typename T> friend class AIThreadSafeSimpleDCRootPool;
413 AIThreadSafeSimpleDCRootPool_pbase(void) { }
414};
415
416/**
417 * @brief A wrapper class for objects that need to be accessed by more than one thread.
418 *
419 * The same as AIThreadSafeSimpleDC except that this class creates its own AIAPRRootPool
420 * for the internally used mutexes and condition, instead of using the current threads
421 * root pool. The advantage of this is that it can be used for objects that need to
422 * be accessed from the destructors of global objects (after main). The disadvantage
423 * is that it's less efficient to use your own root pool, therefore it's use should be
424 * restricted to those cases where it is absolutely necessary.
425 */
426template<typename T>
427class AIThreadSafeSimpleDCRootPool : private AIThreadSafeSimpleDCRootPool_pbase, public AIThreadSafeSimpleDC<T>
428{
429public:
430 // Construct a wrapper around a default constructed object, using memory allocated
431 // from the operating system for the internal APR objects (mutexes and conditional),
432 // as opposed to allocated from the current threads root pool.
433 AIThreadSafeSimpleDCRootPool(void) :
434 AIThreadSafeSimpleDCRootPool_pbase(),
435 AIThreadSafeSimpleDC<T>(mRootPool) { }
436};
437
438/**
439 * @brief Write lock object and provide read/write access.
440 */
441template<typename T>
442struct AIAccess
443{
444 //! Construct a AIAccess from a non-constant AIThreadSafeSimple.
445 AIAccess(AIThreadSafeSimple<T>& wrapper) : mWrapper(wrapper) { this->mWrapper.mMutex.lock(); }
446
447 //! Access the underlaying object for (read and) write access.
448 T* operator->() const { return this->mWrapper.ptr(); }
449
450 //! Access the underlaying object for (read and) write access.
451 T& operator*() const { return *this->mWrapper.ptr(); }
452
453 ~AIAccess() { this->mWrapper.mMutex.unlock(); }
454
455protected:
456 AIThreadSafeSimple<T>& mWrapper; //!< Reference to the object that we provide access to.
457
458private:
459 // Disallow copy constructing directly.
460 AIAccess(AIAccess const&);
461};
462
463#endif
diff --git a/linden/indra/llcommon/llapp.cpp b/linden/indra/llcommon/llapp.cpp
index e269f59..eedc503 100644
--- a/linden/indra/llcommon/llapp.cpp
+++ b/linden/indra/llcommon/llapp.cpp
@@ -119,13 +119,8 @@ void LLApp::commonCtor()
119 mOptions.append(sd); 119 mOptions.append(sd);
120 } 120 }
121 121
122 // Make sure we clean up APR when we exit
123 // Don't need to do this if we're cleaning up APR in the destructor
124 //atexit(ll_cleanup_apr);
125
126 // Set the application to this instance. 122 // Set the application to this instance.
127 sApplication = this; 123 sApplication = this;
128
129} 124}
130 125
131LLApp::LLApp(LLErrorThread *error_thread) : 126LLApp::LLApp(LLErrorThread *error_thread) :
diff --git a/linden/indra/llcommon/llapr.cpp b/linden/indra/llcommon/llapr.cpp
index 7e3a26c..a013d9c 100644
--- a/linden/indra/llcommon/llapr.cpp
+++ b/linden/indra/llcommon/llapr.cpp
@@ -34,220 +34,7 @@
34 34
35#include "linden_common.h" 35#include "linden_common.h"
36#include "llapr.h" 36#include "llapr.h"
37 37#include "llscopedvolatileaprpool.h"
38apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool
39apr_thread_mutex_t *gLogMutexp = NULL;
40apr_thread_mutex_t *gCallStacksLogMutexp = NULL;
41
42const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool
43
44void ll_init_apr()
45{
46 if (!gAPRPoolp)
47 {
48 // Initialize APR and create the global pool
49 apr_initialize();
50 apr_pool_create(&gAPRPoolp, NULL);
51
52 // Initialize the logging mutex
53 apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
54 apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
55
56 // Initialize thread-local APR pool support.
57 LLVolatileAPRPool::initLocalAPRFilePool();
58 }
59}
60
61
62void ll_cleanup_apr()
63{
64 LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL;
65
66 if (gLogMutexp)
67 {
68 // Clean up the logging mutex
69
70 // All other threads NEED to be done before we clean up APR, so this is okay.
71 apr_thread_mutex_destroy(gLogMutexp);
72 gLogMutexp = NULL;
73 }
74 if (gCallStacksLogMutexp)
75 {
76 // Clean up the logging mutex
77
78 // All other threads NEED to be done before we clean up APR, so this is okay.
79 apr_thread_mutex_destroy(gCallStacksLogMutexp);
80 gCallStacksLogMutexp = NULL;
81 }
82 if (gAPRPoolp)
83 {
84 apr_pool_destroy(gAPRPoolp);
85 gAPRPoolp = NULL;
86 }
87 apr_terminate();
88}
89
90//
91//
92//LLAPRPool
93//
94LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
95{
96 mParent = parent ;
97 mReleasePoolFlag = releasePoolFlag ;
98 mMaxSize = size ;
99 mPool = NULL ;
100
101 createAPRPool() ;
102}
103
104LLAPRPool::~LLAPRPool()
105{
106 releaseAPRPool() ;
107}
108
109void LLAPRPool::createAPRPool()
110{
111 if(mPool)
112 {
113 return ;
114 }
115
116 mStatus = apr_pool_create(&mPool, mParent);
117 ll_apr_warn_status(mStatus) ;
118
119 if(mMaxSize > 0) //size is the number of blocks (which is usually 4K), NOT bytes.
120 {
121 apr_allocator_t *allocator = apr_pool_allocator_get(mPool);
122 if (allocator)
123 {
124 apr_allocator_max_free_set(allocator, mMaxSize) ;
125 }
126 }
127}
128
129void LLAPRPool::releaseAPRPool()
130{
131 if(!mPool)
132 {
133 return ;
134 }
135
136 if(!mParent || mReleasePoolFlag)
137 {
138 apr_pool_destroy(mPool) ;
139 mPool = NULL ;
140 }
141}
142
143apr_pool_t* LLAPRPool::getAPRPool()
144{
145 if(!mPool)
146 {
147 createAPRPool() ;
148 }
149
150 return mPool ;
151}
152LLVolatileAPRPool::LLVolatileAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
153 : LLAPRPool(parent, size, releasePoolFlag)
154{
155 mNumActiveRef = 0 ;
156 mNumTotalRef = 0 ;
157}
158
159apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool()
160{
161 mNumTotalRef++ ;
162 mNumActiveRef++ ;
163 return getAPRPool() ;
164}
165
166void LLVolatileAPRPool::clearVolatileAPRPool()
167{
168 if(mNumActiveRef > 0)
169 {
170 mNumActiveRef--;
171 if(mNumActiveRef < 1)
172 {
173 if(isFull())
174 {
175 mNumTotalRef = 0 ;
176
177 //destroy the apr_pool.
178 releaseAPRPool() ;
179 }
180 else
181 {
182 //This does not actually free the memory,
183 //it just allows the pool to re-use this memory for the next allocation.
184 apr_pool_clear(mPool) ;
185 }
186 }
187 }
188 else
189 {
190 llassert_always(mNumActiveRef > 0) ;
191 }
192
193 //paranoia check if the pool is jammed.
194 //will remove the check before going to release.
195 llassert_always(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ;
196}
197
198BOOL LLVolatileAPRPool::isFull()
199{
200 return mNumTotalRef > FULL_VOLATILE_APR_POOL ;
201}
202
203#ifdef SHOW_ASSERT
204// This allows the use of llassert(is_main_thread()) to assure the current thread is the main thread.
205static void* gIsMainThread;
206bool is_main_thread() { return gIsMainThread == LLVolatileAPRPool::getLocalAPRFilePool(); }
207#endif
208
209// The thread private handle to access the LocalAPRFilePool.
210apr_threadkey_t* LLVolatileAPRPool::sLocalAPRFilePoolKey;
211
212// This should be called exactly once, before the first call to createLocalAPRFilePool.
213// static
214void LLVolatileAPRPool::initLocalAPRFilePool()
215{
216 apr_status_t status = apr_threadkey_private_create(&sLocalAPRFilePoolKey, &destroyLocalAPRFilePool, gAPRPoolp);
217 ll_apr_assert_status(status); // Or out of memory, or system-imposed limit on the
218 // total number of keys per process {PTHREAD_KEYS_MAX}
219 // has been exceeded.
220 // Create the thread-local pool for the main thread (this function is called by the main thread).
221 createLocalAPRFilePool();
222#ifdef SHOW_ASSERT
223 gIsMainThread = getLocalAPRFilePool();
224#endif
225}
226
227// This should be called once for every thread, before it uses getLocalAPRFilePool.
228// static
229void LLVolatileAPRPool::createLocalAPRFilePool()
230{
231 void* thread_local_data = new LLVolatileAPRPool;
232 apr_status_t status = apr_threadkey_private_set(thread_local_data, sLocalAPRFilePoolKey);
233 llassert_always(status == APR_SUCCESS);
234}
235
236// This is called once for every thread when the thread is destructed.
237// static
238void LLVolatileAPRPool::destroyLocalAPRFilePool(void* thread_local_data)
239{
240 delete reinterpret_cast<LLVolatileAPRPool*>(thread_local_data);
241}
242
243// static
244LLVolatileAPRPool* LLVolatileAPRPool::getLocalAPRFilePool()
245{
246 void* thread_local_data;
247 apr_status_t status = apr_threadkey_private_get(&thread_local_data, sLocalAPRFilePoolKey);
248 llassert_always(status == APR_SUCCESS);
249 return reinterpret_cast<LLVolatileAPRPool*>(thread_local_data);
250}
251 38
252//--------------------------------------------------------------------- 39//---------------------------------------------------------------------
253// 40//
@@ -310,13 +97,15 @@ void ll_apr_assert_status(apr_status_t status)
310// 97//
311LLAPRFile::LLAPRFile() 98LLAPRFile::LLAPRFile()
312 : mFile(NULL), 99 : mFile(NULL),
313 mCurrentFilePoolp(NULL) 100 mVolatileFilePoolp(NULL),
101 mRegularFilePoolp(NULL)
314{ 102{
315} 103}
316 104
317LLAPRFile::LLAPRFile(const std::string& filename, apr_int32_t flags, access_t access_type) 105LLAPRFile::LLAPRFile(const std::string& filename, apr_int32_t flags, access_t access_type)
318 : mFile(NULL), 106 : mFile(NULL),
319 mCurrentFilePoolp(NULL) 107 mVolatileFilePoolp(NULL),
108 mRegularFilePoolp(NULL)
320{ 109{
321 open(filename, flags, access_type); 110 open(filename, flags, access_type);
322} 111}
@@ -335,10 +124,16 @@ apr_status_t LLAPRFile::close()
335 mFile = NULL ; 124 mFile = NULL ;
336 } 125 }
337 126
338 if(mCurrentFilePoolp) 127 if (mVolatileFilePoolp)
339 { 128 {
340 mCurrentFilePoolp->clearVolatileAPRPool() ; 129 mVolatileFilePoolp->clearVolatileAPRPool() ;
341 mCurrentFilePoolp = NULL ; 130 mVolatileFilePoolp = NULL ;
131 }
132
133 if (mRegularFilePoolp)
134 {
135 delete mRegularFilePoolp;
136 mRegularFilePoolp = NULL;
342 } 137 }
343 138
344 return ret ; 139 return ret ;
@@ -347,25 +142,28 @@ apr_status_t LLAPRFile::close()
347apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, access_t access_type, S32* sizep) 142apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, access_t access_type, S32* sizep)
348{ 143{
349 llassert_always(!mFile); 144 llassert_always(!mFile);
350 llassert_always(!mCurrentFilePoolp); 145 llassert_always(!mVolatileFilePoolp && !mRegularFilePoolp);
351 146
352 // Access the pool and increment it's reference count. 147 apr_status_t status;
353 // The reference count of LLVolatileAPRPool objects will be decremented
354 // again in LLAPRFile::close by calling mCurrentFilePoolp->clearVolatileAPRPool().
355 apr_pool_t* pool;
356 if (access_type == local)
357 {
358 // Use a "volatile" thread-local pool.
359 mCurrentFilePoolp = LLVolatileAPRPool::getLocalAPRFilePool();
360 pool = mCurrentFilePoolp->getVolatileAPRPool();
361 }
362 else
363 { 148 {
364 llassert(is_main_thread()); 149 apr_pool_t* apr_file_open_pool;
365 pool = gAPRPoolp; 150 if (access_type == local)
151 {
152 // Use a "volatile" thread-local pool.
153 mVolatileFilePoolp = &AIThreadLocalData::tldata().mVolatileAPRPool;
154 // Access the pool and increment it's reference count.
155 // The reference count of AIVolatileAPRPool objects will be decremented
156 // again in LLAPRFile::close by calling mVolatileFilePoolp->clearVolatileAPRPool().
157 apr_file_open_pool = mVolatileFilePoolp->getVolatileAPRPool();
158 }
159 else
160 {
161 mRegularFilePoolp = new AIAPRPool(AIThreadLocalData::tldata().mRootPool);
162 apr_file_open_pool = (*mRegularFilePoolp)();
163 }
164 status = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, apr_file_open_pool);
366 } 165 }
367 apr_status_t s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, pool); 166 if (status != APR_SUCCESS || !mFile)
368 if (s != APR_SUCCESS || !mFile)
369 { 167 {
370 mFile = NULL ; 168 mFile = NULL ;
371 close() ; 169 close() ;
@@ -373,7 +171,7 @@ apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, acc
373 { 171 {
374 *sizep = 0; 172 *sizep = 0;
375 } 173 }
376 return s; 174 return status;
377 } 175 }
378 176
379 if (sizep) 177 if (sizep)
@@ -390,7 +188,7 @@ apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, acc
390 *sizep = file_size; 188 *sizep = file_size;
391 } 189 }
392 190
393 return s; 191 return status;
394} 192}
395 193
396// File I/O 194// File I/O
@@ -440,17 +238,6 @@ S32 LLAPRFile::seek(apr_seek_where_t where, S32 offset)
440//static components of LLAPRFile 238//static components of LLAPRFile
441// 239//
442 240
443// Used in the static functions below.
444class LLScopedVolatileAPRFilePool {
445private:
446 LLVolatileAPRPool* mPool;
447 apr_pool_t* apr_pool;
448public:
449 LLScopedVolatileAPRFilePool() : mPool(LLVolatileAPRPool::getLocalAPRFilePool()), apr_pool(mPool->getVolatileAPRPool()) { }
450 ~LLScopedVolatileAPRFilePool() { mPool->clearVolatileAPRPool(); }
451 operator apr_pool_t*() const { return apr_pool; }
452};
453
454//static 241//static
455S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset) 242S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset)
456{ 243{
@@ -487,7 +274,7 @@ S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset)
487S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes) 274S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes)
488{ 275{
489 apr_file_t* file_handle; 276 apr_file_t* file_handle;
490 LLScopedVolatileAPRFilePool pool; 277 LLScopedVolatileAPRPool pool;
491 apr_status_t s = apr_file_open(&file_handle, filename.c_str(), APR_READ|APR_BINARY, APR_OS_DEFAULT, pool); 278 apr_status_t s = apr_file_open(&file_handle, filename.c_str(), APR_READ|APR_BINARY, APR_OS_DEFAULT, pool);
492 if (s != APR_SUCCESS || !file_handle) 279 if (s != APR_SUCCESS || !file_handle)
493 { 280 {
@@ -539,7 +326,7 @@ S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 n
539 } 326 }
540 327
541 apr_file_t* file_handle; 328 apr_file_t* file_handle;
542 LLScopedVolatileAPRFilePool pool; 329 LLScopedVolatileAPRPool pool;
543 apr_status_t s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool); 330 apr_status_t s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool);
544 if (s != APR_SUCCESS || !file_handle) 331 if (s != APR_SUCCESS || !file_handle)
545 { 332 {
@@ -584,7 +371,7 @@ bool LLAPRFile::remove(const std::string& filename)
584{ 371{
585 apr_status_t s; 372 apr_status_t s;
586 373
587 LLScopedVolatileAPRFilePool pool; 374 LLScopedVolatileAPRPool pool;
588 s = apr_file_remove(filename.c_str(), pool); 375 s = apr_file_remove(filename.c_str(), pool);
589 376
590 if (s != APR_SUCCESS) 377 if (s != APR_SUCCESS)
@@ -601,7 +388,7 @@ bool LLAPRFile::rename(const std::string& filename, const std::string& newname)
601{ 388{
602 apr_status_t s; 389 apr_status_t s;
603 390
604 LLScopedVolatileAPRFilePool pool; 391 LLScopedVolatileAPRPool pool;
605 s = apr_file_rename(filename.c_str(), newname.c_str(), pool); 392 s = apr_file_rename(filename.c_str(), newname.c_str(), pool);
606 393
607 if (s != APR_SUCCESS) 394 if (s != APR_SUCCESS)
@@ -619,7 +406,7 @@ bool LLAPRFile::isExist(const std::string& filename, apr_int32_t flags)
619 apr_file_t* file_handle; 406 apr_file_t* file_handle;
620 apr_status_t s; 407 apr_status_t s;
621 408
622 LLScopedVolatileAPRFilePool pool; 409 LLScopedVolatileAPRPool pool;
623 s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool); 410 s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool);
624 411
625 if (s != APR_SUCCESS || !file_handle) 412 if (s != APR_SUCCESS || !file_handle)
@@ -640,7 +427,7 @@ S32 LLAPRFile::size(const std::string& filename)
640 apr_finfo_t info; 427 apr_finfo_t info;
641 apr_status_t s; 428 apr_status_t s;
642 429
643 LLScopedVolatileAPRFilePool pool; 430 LLScopedVolatileAPRPool pool;
644 s = apr_file_open(&file_handle, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool); 431 s = apr_file_open(&file_handle, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool);
645 432
646 if (s != APR_SUCCESS || !file_handle) 433 if (s != APR_SUCCESS || !file_handle)
@@ -669,7 +456,7 @@ bool LLAPRFile::makeDir(const std::string& dirname)
669{ 456{
670 apr_status_t s; 457 apr_status_t s;
671 458
672 LLScopedVolatileAPRFilePool pool; 459 LLScopedVolatileAPRPool pool;
673 s = apr_dir_make(dirname.c_str(), APR_FPROT_OS_DEFAULT, pool); 460 s = apr_dir_make(dirname.c_str(), APR_FPROT_OS_DEFAULT, pool);
674 461
675 if (s != APR_SUCCESS) 462 if (s != APR_SUCCESS)
@@ -686,7 +473,7 @@ bool LLAPRFile::removeDir(const std::string& dirname)
686{ 473{
687 apr_status_t s; 474 apr_status_t s;
688 475
689 LLScopedVolatileAPRFilePool pool; 476 LLScopedVolatileAPRPool pool;
690 s = apr_file_remove(dirname.c_str(), pool); 477 s = apr_file_remove(dirname.c_str(), pool);
691 478
692 if (s != APR_SUCCESS) 479 if (s != APR_SUCCESS)
diff --git a/linden/indra/llcommon/llapr.h b/linden/indra/llcommon/llapr.h
index 2aed515..ded15f5 100644
--- a/linden/indra/llcommon/llapr.h
+++ b/linden/indra/llcommon/llapr.h
@@ -48,73 +48,8 @@
48#include "apr_atomic.h" 48#include "apr_atomic.h"
49#include "llstring.h" 49#include "llstring.h"
50 50
51extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp; 51class AIAPRPool;
52 52class AIVolatileAPRPool;
53/**
54 * @brief initialize the common apr constructs -- apr itself, the
55 * global pool, and a mutex.
56 */
57void LL_COMMON_API ll_init_apr();
58
59/**
60 * @brief Cleanup those common apr constructs.
61 */
62void LL_COMMON_API ll_cleanup_apr();
63
64//
65//LL apr_pool
66//manage apr_pool_t, destroy allocated apr_pool in the destruction function.
67//
68class LL_COMMON_API LLAPRPool
69{
70public:
71 LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
72 ~LLAPRPool() ;
73
74 apr_pool_t* getAPRPool() ;
75 apr_status_t getStatus() {return mStatus ; }
76
77protected:
78 void releaseAPRPool() ;
79 void createAPRPool() ;
80
81protected:
82 apr_pool_t* mPool ; //pointing to an apr_pool
83 apr_pool_t* mParent ; //parent pool
84 apr_size_t mMaxSize ; //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
85 apr_status_t mStatus ; //status when creating the pool
86 BOOL mReleasePoolFlag ; //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
87};
88
89//
90//volatile LL apr_pool
91//which clears memory automatically.
92//so it can not hold static data or data after memory is cleared
93//
94class LL_COMMON_API LLVolatileAPRPool : protected LLAPRPool
95{
96public:
97 LLVolatileAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
98 ~LLVolatileAPRPool(){}
99
100 apr_pool_t* getVolatileAPRPool() ;
101
102 void clearVolatileAPRPool() ;
103
104 BOOL isFull() ;
105 BOOL isEmpty() {return !mNumActiveRef ;}
106
107 static void initLocalAPRFilePool();
108 static void createLocalAPRFilePool();
109 static void destroyLocalAPRFilePool(void* thread_local_data);
110 static LLVolatileAPRPool* getLocalAPRFilePool();
111
112private:
113 S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
114 S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating.
115
116 static apr_threadkey_t* sLocalAPRFilePoolKey;
117} ;
118 53
119/** 54/**
120 * @class LLScopedLock 55 * @class LLScopedLock
@@ -205,7 +140,8 @@ class LL_COMMON_API LLAPRFile : boost::noncopyable
205 // make this non copyable since a copy closes the file 140 // make this non copyable since a copy closes the file
206private: 141private:
207 apr_file_t* mFile ; 142 apr_file_t* mFile ;
208 LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool. 143 AIVolatileAPRPool* mVolatileFilePoolp; // (Thread local) APR pool currently in use.
144 AIAPRPool* mRegularFilePoolp; // ...or a regular pool.
209 145
210public: 146public:
211 enum access_t { 147 enum access_t {
@@ -260,6 +196,4 @@ bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
260 196
261void LL_COMMON_API ll_apr_assert_status(apr_status_t status); 197void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
262 198
263extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
264
265#endif // LL_LLAPR_H 199#endif // LL_LLAPR_H
diff --git a/linden/indra/llcommon/llavatarname.cpp b/linden/indra/llcommon/llavatarname.cpp
new file mode 100644
index 0000000..ebe8c88
--- /dev/null
+++ b/linden/indra/llcommon/llavatarname.cpp
@@ -0,0 +1,150 @@
1/**
2 * @file llavatarname.cpp
3 * @brief Represents name-related data for an avatar, such as the
4 * username/SLID ("bobsmith123" or "james.linden") and the display
5 * name ("James Cook")
6 *
7 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
8 * Second Life Viewer Source Code
9 * Copyright (C) 2010, Linden Research, Inc.
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation;
14 * version 2.1 of the License only.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
26 * $/LicenseInfo$
27 */
28#include "linden_common.h"
29
30#include "llavatarname.h"
31
32#include "lldate.h"
33#include "llsd.h"
34
35bool LLAvatarName::sOmitResidentAsLastName = false;
36
37// Store these in pre-built std::strings to avoid memory allocations in
38// LLSD map lookups
39static const std::string USERNAME("username");
40static const std::string DISPLAY_NAME("display_name");
41static const std::string LEGACY_FIRST_NAME("legacy_first_name");
42static const std::string LEGACY_LAST_NAME("legacy_last_name");
43static const std::string IS_DISPLAY_NAME_DEFAULT("is_display_name_default");
44static const std::string DISPLAY_NAME_EXPIRES("display_name_expires");
45static const std::string DISPLAY_NAME_NEXT_UPDATE("display_name_next_update");
46
47LLAvatarName::LLAvatarName()
48: mUsername(),
49 mDisplayName(),
50 mLegacyFirstName(),
51 mLegacyLastName(),
52 mIsDisplayNameDefault(false),
53 mIsDummy(false),
54 mExpires(F64_MAX),
55 mNextUpdate(0.0)
56{ }
57
58bool LLAvatarName::operator<(const LLAvatarName& rhs) const
59{
60 if (mUsername == rhs.mUsername)
61 return mDisplayName < rhs.mDisplayName;
62 else
63 return mUsername < rhs.mUsername;
64}
65
66LLSD LLAvatarName::asLLSD() const
67{
68 LLSD sd;
69 sd[USERNAME] = mUsername;
70 sd[DISPLAY_NAME] = mDisplayName;
71 sd[LEGACY_FIRST_NAME] = mLegacyFirstName;
72 sd[LEGACY_LAST_NAME] = mLegacyLastName;
73 sd[IS_DISPLAY_NAME_DEFAULT] = mIsDisplayNameDefault;
74 sd[DISPLAY_NAME_EXPIRES] = LLDate(mExpires);
75 sd[DISPLAY_NAME_NEXT_UPDATE] = LLDate(mNextUpdate);
76 return sd;
77}
78
79void LLAvatarName::fromLLSD(const LLSD& sd)
80{
81 mUsername = sd[USERNAME].asString();
82 mDisplayName = sd[DISPLAY_NAME].asString();
83 mLegacyFirstName = sd[LEGACY_FIRST_NAME].asString();
84 mLegacyLastName = sd[LEGACY_LAST_NAME].asString();
85 mIsDisplayNameDefault = sd[IS_DISPLAY_NAME_DEFAULT].asBoolean();
86 LLDate expires = sd[DISPLAY_NAME_EXPIRES];
87 mExpires = expires.secondsSinceEpoch();
88 LLDate next_update = sd[DISPLAY_NAME_NEXT_UPDATE];
89 mNextUpdate = next_update.secondsSinceEpoch();
90}
91
92std::string LLAvatarName::getCompleteName() const
93{
94 std::string name;
95 if (!mUsername.empty())
96 {
97 name = mDisplayName + " (" + mUsername + ")";
98 }
99 else
100 {
101 // ...display names are off, legacy name is in mDisplayName
102 name = mDisplayName;
103 }
104 return name;
105}
106
107std::string LLAvatarName::getLegacyName() const
108{
109 std::string name;
110 name.reserve(mLegacyFirstName.size() + 1 + mLegacyLastName.size());
111 name = mLegacyFirstName;
112 if (!sOmitResidentAsLastName || mLegacyLastName != "Resident")
113 {
114 name += " ";
115 name += mLegacyLastName;
116 }
117 return name;
118}
119
120std::string LLAvatarName::getNames(bool linefeed) const
121{
122 std::string name;
123
124 if (mUsername.empty())
125 {
126 // ...display names are off, legacy name is in mDisplayName
127 name = mDisplayName;
128 if (sOmitResidentAsLastName)
129 {
130 LLStringUtil::replaceString(name, " Resident", "");
131 }
132 }
133 else
134 {
135 name = getLegacyName();
136 if (name != mDisplayName)
137 {
138 if (linefeed)
139 {
140 name = mDisplayName + "\n[" + name + "]";
141 }
142 else
143 {
144 name = mDisplayName + " [" + name + "]";
145 }
146 }
147 }
148
149 return name;
150}
diff --git a/linden/indra/llcommon/llavatarname.h b/linden/indra/llcommon/llavatarname.h
new file mode 100644
index 0000000..3b6c6ea
--- /dev/null
+++ b/linden/indra/llcommon/llavatarname.h
@@ -0,0 +1,105 @@
1/**
2 * @file llavatarname.h
3 * @brief Represents name-related data for an avatar, such as the
4 * username/SLID ("bobsmith123" or "james.linden") and the display
5 * name ("James Cook")
6 *
7 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
8 * Second Life Viewer Source Code
9 * Copyright (C) 2010, Linden Research, Inc.
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation;
14 * version 2.1 of the License only.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
26 * $/LicenseInfo$
27 */
28#ifndef LLAVATARNAME_H
29#define LLAVATARNAME_H
30
31#include <string>
32
33class LLSD;
34
35class LL_COMMON_API LLAvatarName
36{
37public:
38 LLAvatarName();
39
40 bool operator<(const LLAvatarName& rhs) const;
41
42 LLSD asLLSD() const;
43
44 void fromLLSD(const LLSD& sd);
45
46 // For normal names, returns "James Linden (james.linden)"
47 // When display names are disabled returns just "James Linden"
48 std::string getCompleteName() const;
49
50 // For normal names, returns "Whatever Display Name (John Doe)" when
51 // display name and legacy name are different, or just "John Doe"
52 // when they are equal or when display names are disabled.
53 // When linefeed == true, the space between the display name and
54 // the opening parenthesis for the legacy name is replaced with a
55 // line feed.
56 std::string getNames(bool linefeed = false) const;
57
58 // Returns "James Linden" or "bobsmith123 Resident" for backwards
59 // compatibility with systems like voice and muting
60 std::string getLegacyName() const;
61
62 // "bobsmith123" or "james.linden", US-ASCII only
63 std::string mUsername;
64
65 // "Jose' Sanchez" or "James Linden", UTF-8 encoded Unicode
66 // Contains data whether or not user has explicitly set
67 // a display name; may duplicate their username.
68 std::string mDisplayName;
69
70 // For "James Linden", "James"
71 // For "bobsmith123", "bobsmith123"
72 // Used to communicate with legacy systems like voice and muting which
73 // rely on old-style names.
74 std::string mLegacyFirstName;
75
76 // For "James Linden", "Linden"
77 // For "bobsmith123", "Resident"
78 // see above for rationale
79 std::string mLegacyLastName;
80
81 // If true, both display name and SLID were generated from
82 // a legacy first and last name, like "James Linden (james.linden)"
83 bool mIsDisplayNameDefault;
84
85 // Under error conditions, we may insert "dummy" records with
86 // names equal to legacy name into caches as placeholders.
87 // These can be shown in UI, but are not serialized.
88 bool mIsDummy;
89
90 // Names can change, so need to keep track of when name was
91 // last checked.
92 // Unix time-from-epoch seconds for efficiency
93 F64 mExpires;
94
95 // You can only change your name every N hours, so record
96 // when the next update is allowed
97 // Unix time-from-epoch seconds
98 F64 mNextUpdate;
99
100 // true to prevent the displaying of "Resident" as a last name
101 // in legacy names
102 static bool sOmitResidentAsLastName;
103};
104
105#endif
diff --git a/linden/indra/llcommon/llcommon.cpp b/linden/indra/llcommon/llcommon.cpp
index 2cbb718..298dd46 100644
--- a/linden/indra/llcommon/llcommon.cpp
+++ b/linden/indra/llcommon/llcommon.cpp
@@ -35,17 +35,9 @@
35#include "llthread.h" 35#include "llthread.h"
36 36
37//static 37//static
38BOOL LLCommon::sAprInitialized = FALSE;
39
40//static
41void LLCommon::initClass() 38void LLCommon::initClass()
42{ 39{
43 LLMemory::initClass(); 40 LLMemory::initClass();
44 if (!sAprInitialized)
45 {
46 ll_init_apr();
47 sAprInitialized = TRUE;
48 }
49 LLTimer::initClass(); 41 LLTimer::initClass();
50 LLThreadSafeRefCount::initThreadSafeRefCount(); 42 LLThreadSafeRefCount::initThreadSafeRefCount();
51// LLWorkerThread::initClass(); 43// LLWorkerThread::initClass();
@@ -59,10 +51,5 @@ void LLCommon::cleanupClass()
59// LLWorkerThread::cleanupClass(); 51// LLWorkerThread::cleanupClass();
60 LLThreadSafeRefCount::cleanupThreadSafeRefCount(); 52 LLThreadSafeRefCount::cleanupThreadSafeRefCount();
61 LLTimer::cleanupClass(); 53 LLTimer::cleanupClass();
62 if (sAprInitialized)
63 {
64 ll_cleanup_apr();
65 sAprInitialized = FALSE;
66 }
67 LLMemory::cleanupClass(); 54 LLMemory::cleanupClass();
68} 55}
diff --git a/linden/indra/llcommon/llcommon.h b/linden/indra/llcommon/llcommon.h
index 851d4ac..300ebe2 100644
--- a/linden/indra/llcommon/llcommon.h
+++ b/linden/indra/llcommon/llcommon.h
@@ -43,8 +43,6 @@ class LL_COMMON_API LLCommon
43public: 43public:
44 static void initClass(); 44 static void initClass();
45 static void cleanupClass(); 45 static void cleanupClass();
46private:
47 static BOOL sAprInitialized;
48}; 46};
49 47
50#endif 48#endif
diff --git a/linden/indra/llcommon/llerror.cpp b/linden/indra/llcommon/llerror.cpp
index edc570f..a9587c6 100644
--- a/linden/indra/llcommon/llerror.cpp
+++ b/linden/indra/llcommon/llerror.cpp
@@ -46,6 +46,8 @@
46# include <unistd.h> 46# include <unistd.h>
47#endif // !LL_WINDOWS 47#endif // !LL_WINDOWS
48#if LL_WINDOWS 48#if LL_WINDOWS
49# define WIN32_LEAN_AND_MEAN
50# include <winsock2.h>
49# include <windows.h> 51# include <windows.h>
50#endif // LL_WINDOWS 52#endif // LL_WINDOWS
51#include <vector> 53#include <vector>
@@ -871,6 +873,9 @@ You get:
871 873
872*/ 874*/
873 875
876apr_thread_mutex_t* gLogMutexp;
877apr_thread_mutex_t* gCallStacksLogMutexp;
878
874namespace { 879namespace {
875 bool checkLevelMap(const LevelMap& map, const std::string& key, 880 bool checkLevelMap(const LevelMap& map, const std::string& key,
876 LLError::ELevel& level) 881 LLError::ELevel& level)
diff --git a/linden/indra/llcommon/llfile.cpp b/linden/indra/llcommon/llfile.cpp
index 2a76f7f..6b68630 100644
--- a/linden/indra/llcommon/llfile.cpp
+++ b/linden/indra/llcommon/llfile.cpp
@@ -34,6 +34,8 @@
34 */ 34 */
35 35
36#if LL_WINDOWS 36#if LL_WINDOWS
37# define WIN32_LEAN_AND_MEAN
38# include <winsock2.h>
37#include <windows.h> 39#include <windows.h>
38#endif 40#endif
39 41
diff --git a/linden/indra/llcommon/llfindlocale.cpp b/linden/indra/llcommon/llfindlocale.cpp
index 505f5c5..71675af 100644
--- a/linden/indra/llcommon/llfindlocale.cpp
+++ b/linden/indra/llcommon/llfindlocale.cpp
@@ -39,6 +39,8 @@
39#include <ctype.h> 39#include <ctype.h>
40 40
41#ifdef WIN32 41#ifdef WIN32
42# define WIN32_LEAN_AND_MEAN
43# include <winsock2.h>
42#include <windows.h> 44#include <windows.h>
43#include <winnt.h> 45#include <winnt.h>
44#endif 46#endif
diff --git a/linden/indra/llcommon/llfixedbuffer.cpp b/linden/indra/llcommon/llfixedbuffer.cpp
index e9d6029..37a12ad 100644
--- a/linden/indra/llcommon/llfixedbuffer.cpp
+++ b/linden/indra/llcommon/llfixedbuffer.cpp
@@ -33,9 +33,8 @@
33#include "llfixedbuffer.h" 33#include "llfixedbuffer.h"
34 34
35LLFixedBuffer::LLFixedBuffer(const U32 max_lines) 35LLFixedBuffer::LLFixedBuffer(const U32 max_lines)
36 : mMutex(NULL) 36 : mMaxLines(max_lines)
37{ 37{
38 mMaxLines = max_lines;
39 mTimer.reset(); 38 mTimer.reset();
40} 39}
41 40
diff --git a/linden/indra/llcommon/llmemory.cpp b/linden/indra/llcommon/llmemory.cpp
index 74004b0..2b01442 100644
--- a/linden/indra/llcommon/llmemory.cpp
+++ b/linden/indra/llcommon/llmemory.cpp
@@ -33,6 +33,8 @@
33#include "linden_common.h" 33#include "linden_common.h"
34 34
35#if defined(LL_WINDOWS) 35#if defined(LL_WINDOWS)
36# define WIN32_LEAN_AND_MEAN
37# include <winsock2.h>
36# include <windows.h> 38# include <windows.h>
37# include <psapi.h> 39# include <psapi.h>
38#elif defined(LL_DARWIN) 40#elif defined(LL_DARWIN)
diff --git a/linden/indra/llcommon/llprocesslauncher.h b/linden/indra/llcommon/llprocesslauncher.h
index b72be27..9833a13 100644
--- a/linden/indra/llcommon/llprocesslauncher.h
+++ b/linden/indra/llcommon/llprocesslauncher.h
@@ -34,6 +34,8 @@
34#define LL_LLPROCESSLAUNCHER_H 34#define LL_LLPROCESSLAUNCHER_H
35 35
36#if LL_WINDOWS 36#if LL_WINDOWS
37# define WIN32_LEAN_AND_MEAN
38# include <winsock2.h>
37#include <windows.h> 39#include <windows.h>
38#endif 40#endif
39 41
diff --git a/linden/indra/llcommon/llscopedvolatileaprpool.h b/linden/indra/llcommon/llscopedvolatileaprpool.h
new file mode 100644
index 0000000..724dc7f
--- /dev/null
+++ b/linden/indra/llcommon/llscopedvolatileaprpool.h
@@ -0,0 +1,58 @@
1/**
2 * @file llscopedvolatileaprpool.h
3 * @brief Implementation of LLScopedVolatileAPRPool
4 *
5 * $LicenseInfo:firstyear=2010&license=viewergpl$
6 *
7 * Copyright (c) 2010, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at
21 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 *
23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above,
25 * and agree to abide by those obligations.
26 *
27 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$
31 */
32
33#ifndef LL_LLSCOPEDVOLATILEAPRPOOL_H
34#define LL_LLSCOPEDVOLATILEAPRPOOL_H
35
36#include "llthread.h"
37
38//! Scoped volatile memory pool.
39//
40// As the AIVolatileAPRPool should never keep allocations very
41// long, it's most common use is for allocations with a lifetime
42// equal to it's scope.
43//
44// This is a convenience class that makes just a little easier to type.
45//
46class LLScopedVolatileAPRPool
47{
48private:
49 AIVolatileAPRPool& mPool;
50 apr_pool_t* mScopedAPRpool;
51public:
52 LLScopedVolatileAPRPool() : mPool(AIThreadLocalData::tldata().mVolatileAPRPool), mScopedAPRpool(mPool.getVolatileAPRPool()) { }
53 ~LLScopedVolatileAPRPool() { mPool.clearVolatileAPRPool(); }
54 // Only use this to pass the pointer to a libapr-1 function that requires it.
55 operator apr_pool_t*() const { return mScopedAPRpool; }
56};
57
58#endif
diff --git a/linden/indra/llcommon/llthread.cpp b/linden/indra/llcommon/llthread.cpp
index 692d6c4..f7732cb 100644
--- a/linden/indra/llcommon/llthread.cpp
+++ b/linden/indra/llcommon/llthread.cpp
@@ -72,8 +72,8 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
72 // Set thread state to running 72 // Set thread state to running
73 threadp->mStatus = RUNNING; 73 threadp->mStatus = RUNNING;
74 74
75 // Create a thread local APRFile pool. 75 // Create a thread local data.
76 LLVolatileAPRPool::createLocalAPRFilePool(); 76 AIThreadLocalData::create(threadp);
77 77
78 // Run the user supplied function 78 // Run the user supplied function
79 threadp->run(); 79 threadp->run();
@@ -87,24 +87,14 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
87} 87}
88 88
89 89
90LLThread::LLThread(const std::string& name, apr_pool_t *poolp) : 90LLThread::LLThread(std::string const& name) :
91 mPaused(false), 91 mPaused(false),
92 mName(name), 92 mName(name),
93 mAPRThreadp(NULL), 93 mAPRThreadp(NULL),
94 mStatus(STOPPED) 94 mStatus(STOPPED),
95 mThreadLocalData(NULL)
95{ 96{
96 // Thread creation probably CAN be paranoid about APR being initialized, if necessary 97 mRunCondition = new LLCondition;
97 if (poolp)
98 {
99 mIsLocalPool = false;
100 mAPRPoolp = poolp;
101 }
102 else
103 {
104 mIsLocalPool = true;
105 apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
106 }
107 mRunCondition = new LLCondition(mAPRPoolp);
108} 98}
109 99
110 100
@@ -147,24 +137,18 @@ void LLThread::shutdown()
147 if (!isStopped()) 137 if (!isStopped())
148 { 138 {
149 // This thread just wouldn't stop, even though we gave it time 139 // This thread just wouldn't stop, even though we gave it time
150 llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl; 140 llwarns << "LLThread::shutdown() exiting thread before clean exit!" << llendl;
151 return; 141 return;
152 } 142 }
153 mAPRThreadp = NULL; 143 mAPRThreadp = NULL;
154 } 144 }
155 145
156 delete mRunCondition; 146 delete mRunCondition;
157
158 if (mIsLocalPool)
159 {
160 apr_pool_destroy(mAPRPoolp);
161 }
162} 147}
163 148
164
165void LLThread::start() 149void LLThread::start()
166{ 150{
167 apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp); 151 apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, tldata().mRootPool());
168 152
169 // We won't bother joining 153 // We won't bother joining
170 apr_thread_detach(mAPRThreadp); 154 apr_thread_detach(mAPRThreadp);
@@ -265,38 +249,72 @@ void LLThread::wakeLocked()
265 } 249 }
266} 250}
267 251
268//============================================================================ 252#ifdef SHOW_ASSERT
253// This allows the use of llassert(is_main_thread()) to assure the current thread is the main thread.
254static apr_os_thread_t main_thread_id;
255bool is_main_thread() { return apr_os_thread_equal(main_thread_id, apr_os_thread_current()); }
256#endif
269 257
270LLMutex::LLMutex(apr_pool_t *poolp) : 258// The thread private handle to access the AIThreadLocalData instance.
271 mAPRMutexp(NULL) 259apr_threadkey_t* AIThreadLocalData::sThreadLocalDataKey;
260
261//static
262void AIThreadLocalData::init(void)
272{ 263{
273 //if (poolp) 264 // Only do this once.
274 //{ 265 if (sThreadLocalDataKey)
275 // mIsLocalPool = false;
276 // mAPRPoolp = poolp;
277 //}
278 //else
279 { 266 {
280 mIsLocalPool = true; 267 return;
281 apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
282 } 268 }
283 apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mAPRPoolp); 269
270 apr_status_t status = apr_threadkey_private_create(&sThreadLocalDataKey, &AIThreadLocalData::destroy, AIAPRRootPool::get()());
271 ll_apr_assert_status(status); // Or out of memory, or system-imposed limit on the
272 // total number of keys per process {PTHREAD_KEYS_MAX}
273 // has been exceeded.
274
275 // Create the thread-local data for the main thread (this function is called by the main thread).
276 AIThreadLocalData::create(NULL);
277
278#ifdef SHOW_ASSERT
279 // This function is called by the main thread.
280 main_thread_id = apr_os_thread_current();
281#endif
284} 282}
285 283
286LLMutex::~LLMutex() 284// This is called once for every thread when the thread is destructed.
285//static
286void AIThreadLocalData::destroy(void* thread_local_data)
287{ 287{
288#if _DEBUG 288 delete reinterpret_cast<AIThreadLocalData*>(thread_local_data);
289 llassert(!isLocked()); // better not be locked! 289}
290#endif 290
291 apr_thread_mutex_destroy(mAPRMutexp); 291//static
292 mAPRMutexp = NULL; 292void AIThreadLocalData::create(LLThread* threadp)
293 if (mIsLocalPool) 293{
294 AIThreadLocalData* new_tld = new AIThreadLocalData;
295 if (threadp)
294 { 296 {
295 apr_pool_destroy(mAPRPoolp); 297 threadp->mThreadLocalData = new_tld;
296 } 298 }
299 apr_status_t status = apr_threadkey_private_set(new_tld, sThreadLocalDataKey);
300 llassert_always(status == APR_SUCCESS);
297} 301}
298 302
299bool LLMutex::isLocked() 303//static
304AIThreadLocalData& AIThreadLocalData::tldata(void)
305{
306 if (!sThreadLocalDataKey)
307 AIThreadLocalData::init();
308
309 void* data;
310 apr_status_t status = apr_threadkey_private_get(&data, sThreadLocalDataKey);
311 llassert_always(status == APR_SUCCESS);
312 return *static_cast<AIThreadLocalData*>(data);
313}
314
315//============================================================================
316
317bool LLMutexBase::isLocked()
300{ 318{
301 if (!tryLock()) 319 if (!tryLock())
302 { 320 {
@@ -308,12 +326,9 @@ bool LLMutex::isLocked()
308 326
309//============================================================================ 327//============================================================================
310 328
311LLCondition::LLCondition(apr_pool_t *poolp) : 329LLCondition::LLCondition(AIAPRPool& parent) : LLMutex(parent)
312 LLMutex(poolp)
313{ 330{
314 // base class (LLMutex) has already ensured that mAPRPoolp is set up. 331 apr_thread_cond_create(&mAPRCondp, mPool());
315
316 apr_thread_cond_create(&mAPRCondp, mAPRPoolp);
317} 332}
318 333
319LLCondition::~LLCondition() 334LLCondition::~LLCondition()
@@ -349,7 +364,7 @@ void LLThreadSafeRefCount::initThreadSafeRefCount()
349{ 364{
350 if (!sMutex) 365 if (!sMutex)
351 { 366 {
352 sMutex = new LLMutex(0); 367 sMutex = new LLMutex;
353 } 368 }
354} 369}
355 370
diff --git a/linden/indra/llcommon/llthread.h b/linden/indra/llcommon/llthread.h
index 98d64ef..1e982cc 100644
--- a/linden/indra/llcommon/llthread.h
+++ b/linden/indra/llcommon/llthread.h
@@ -38,11 +38,28 @@
38#include "llmemory.h" 38#include "llmemory.h"
39 39
40#include "apr_thread_cond.h" 40#include "apr_thread_cond.h"
41#include "aiaprpool.h"
41 42
42class LLThread; 43class LLThread;
43class LLMutex; 44class LLMutex;
44class LLCondition; 45class LLCondition;
45 46
47class LL_COMMON_API AIThreadLocalData
48{
49private:
50 static apr_threadkey_t* sThreadLocalDataKey;
51
52public:
53 // Thread-local memory pool.
54 AIAPRRootPool mRootPool;
55 AIVolatileAPRPool mVolatileAPRPool;
56
57 static void init(void);
58 static void destroy(void* thread_local_data);
59 static void create(LLThread* pthread);
60 static AIThreadLocalData& tldata(void);
61};
62
46class LL_COMMON_API LLThread 63class LL_COMMON_API LLThread
47{ 64{
48public: 65public:
@@ -53,7 +70,7 @@ public:
53 QUITTING= 2 // Someone wants this thread to quit 70 QUITTING= 2 // Someone wants this thread to quit
54 } EThreadStatus; 71 } EThreadStatus;
55 72
56 LLThread(const std::string& name, apr_pool_t *poolp = NULL); 73 LLThread(std::string const& name);
57 virtual ~LLThread(); // Warning! You almost NEVER want to destroy a thread unless it's in the STOPPED state. 74 virtual ~LLThread(); // Warning! You almost NEVER want to destroy a thread unless it's in the STOPPED state.
58 virtual void shutdown(); // stops the thread 75 virtual void shutdown(); // stops the thread
59 76
@@ -82,7 +99,8 @@ public:
82 // this kicks off the apr thread 99 // this kicks off the apr thread
83 void start(void); 100 void start(void);
84 101
85 apr_pool_t *getAPRPool() { return mAPRPoolp; } 102 // Return thread-local data for the current thread.
103 static AIThreadLocalData& tldata(void) { return AIThreadLocalData::tldata(); }
86 104
87private: 105private:
88 bool mPaused; 106 bool mPaused;
@@ -95,10 +113,11 @@ protected:
95 LLCondition* mRunCondition; 113 LLCondition* mRunCondition;
96 114
97 apr_thread_t *mAPRThreadp; 115 apr_thread_t *mAPRThreadp;
98 apr_pool_t *mAPRPoolp;
99 bool mIsLocalPool;
100 EThreadStatus mStatus; 116 EThreadStatus mStatus;
101 117
118 friend void AIThreadLocalData::create(LLThread* threadp);
119 AIThreadLocalData* mThreadLocalData;
120
102 void setQuitting(); 121 void setQuitting();
103 122
104 // virtual function overridden by subclass -- this will be called when the thread runs 123 // virtual function overridden by subclass -- this will be called when the thread runs
@@ -125,12 +144,9 @@ protected:
125 144
126//============================================================================ 145//============================================================================
127 146
128class LL_COMMON_API LLMutex 147class LL_COMMON_API LLMutexBase
129{ 148{
130public: 149public:
131 LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
132 ~LLMutex();
133
134 void lock() { apr_thread_mutex_lock(mAPRMutexp); } 150 void lock() { apr_thread_mutex_lock(mAPRMutexp); }
135 void unlock() { apr_thread_mutex_unlock(mAPRMutexp); } 151 void unlock() { apr_thread_mutex_unlock(mAPRMutexp); }
136 // Returns true if lock was obtained successfully. 152 // Returns true if lock was obtained successfully.
@@ -139,16 +155,60 @@ public:
139 bool isLocked(); // non-blocking, but does do a lock/unlock so not free 155 bool isLocked(); // non-blocking, but does do a lock/unlock so not free
140 156
141protected: 157protected:
142 apr_thread_mutex_t *mAPRMutexp; 158 // mAPRMutexp is initialized and uninitialized in the derived class.
143 apr_pool_t *mAPRPoolp; 159 apr_thread_mutex_t* mAPRMutexp;
144 bool mIsLocalPool; 160};
161
162class LL_COMMON_API LLMutex : public LLMutexBase
163{
164public:
165 LLMutex(AIAPRPool& parent = LLThread::tldata().mRootPool) : mPool(parent)
166 {
167 apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mPool());
168 }
169 ~LLMutex()
170 {
171 llassert(!isLocked()); // better not be locked!
172 apr_thread_mutex_destroy(mAPRMutexp);
173 mAPRMutexp = NULL;
174 }
175
176protected:
177 AIAPRPool mPool;
145}; 178};
146 179
180#if APR_HAS_THREADS
181// No need to use a root pool in this case.
182typedef LLMutex LLMutexRootPool;
183#else // APR_HAS_THREADS
184class LL_COMMON_API LLMutexRootPool : public LLMutexBase
185{
186public:
187 LLMutexRootPool(void)
188 {
189 apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mRootPool());
190 }
191 ~LLMutexRootPool()
192 {
193#if APR_POOL_DEBUG
194 // It is allowed to destruct root pools from a different thread.
195 mRootPool.grab_ownership();
196#endif
197 llassert(!isLocked()); // better not be locked!
198 apr_thread_mutex_destroy(mAPRMutexp);
199 mAPRMutexp = NULL;
200 }
201
202protected:
203 AIAPRRootPool mRootPool;
204};
205#endif // APR_HAS_THREADS
206
147// Actually a condition/mutex pair (since each condition needs to be associated with a mutex). 207// Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
148class LL_COMMON_API LLCondition : public LLMutex 208class LL_COMMON_API LLCondition : public LLMutex
149{ 209{
150public: 210public:
151 LLCondition(apr_pool_t *apr_poolp); // Defaults to global pool, could use the thread pool as well. 211 LLCondition(AIAPRPool& parent = LLThread::tldata().mRootPool);
152 ~LLCondition(); 212 ~LLCondition();
153 213
154 void wait(); // blocks 214 void wait(); // blocks
@@ -162,7 +222,7 @@ protected:
162class LL_COMMON_API LLMutexLock 222class LL_COMMON_API LLMutexLock
163{ 223{
164public: 224public:
165 LLMutexLock(LLMutex* mutex) 225 LLMutexLock(LLMutexBase* mutex)
166 { 226 {
167 mMutex = mutex; 227 mMutex = mutex;
168 mMutex->lock(); 228 mMutex->lock();
@@ -172,7 +232,102 @@ public:
172 mMutex->unlock(); 232 mMutex->unlock();
173 } 233 }
174private: 234private:
175 LLMutex* mMutex; 235 LLMutexBase* mMutex;
236};
237
238class AIRWLock
239{
240public:
241 AIRWLock(AIAPRPool& parent = LLThread::tldata().mRootPool) :
242 mWriterWaitingMutex(parent), mNoHoldersCondition(parent), mHoldersCount(0), mWriterIsWaiting(false) { }
243
244private:
245 LLMutex mWriterWaitingMutex; //!< This mutex is locked while some writer is waiting for access.
246 LLCondition mNoHoldersCondition; //!< Access control for mHoldersCount. Condition true when there are no more holders.
247 int mHoldersCount; //!< Number of readers or -1 if a writer locked this object.
248 // This is volatile because we read it outside the critical area of mWriterWaitingMutex, at [1].
249 // That means that other threads can change it while we are already in the (inlined) function rdlock.
250 // Without volatile, the following assembly would fail:
251 // register x = mWriterIsWaiting;
252 // /* some thread changes mWriterIsWaiting */
253 // if (x ...
254 // However, because the function is fuzzy to begin with (we don't mind that this race
255 // condition exists) it would work fine without volatile. So, basically it's just here
256 // out of principle ;). -- Aleric
257 bool volatile mWriterIsWaiting; //!< True when there is a writer waiting for write access.
258
259public:
260 void rdlock(bool high_priority = false)
261 {
262 // Give a writer a higher priority (kinda fuzzy).
263 if (mWriterIsWaiting && !high_priority) // [1] If there is a writer interested,
264 {
265 mWriterWaitingMutex.lock(); // [2] then give it precedence and wait here.
266 // If we get here then the writer got it's access; mHoldersCount == -1.
267 mWriterWaitingMutex.unlock();
268 }
269 mNoHoldersCondition.lock(); // [3] Get exclusive access to mHoldersCount.
270 while (mHoldersCount == -1) // [4]
271 {
272 mNoHoldersCondition.wait(); // [5] Wait till mHoldersCount is (or just was) 0.
273 }
274 ++mHoldersCount; // One more reader.
275 mNoHoldersCondition.unlock(); // Release lock on mHoldersCount.
276 }
277 void rdunlock(void)
278 {
279 mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount.
280 if (--mHoldersCount == 0) // Was this the last reader?
281 {
282 mNoHoldersCondition.signal(); // Tell waiting threads, see [5], [6] and [7].
283 }
284 mNoHoldersCondition.unlock(); // Release lock on mHoldersCount.
285 }
286 void wrlock(void)
287 {
288 mWriterWaitingMutex.lock(); // Block new readers, see [2],
289 mWriterIsWaiting = true; // from this moment on, see [1].
290 mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount.
291 while (mHoldersCount != 0) // Other readers or writers have this lock?
292 {
293 mNoHoldersCondition.wait(); // [6] Wait till mHoldersCount is (or just was) 0.
294 }
295 mWriterIsWaiting = false; // Stop checking the lock for new readers, see [1].
296 mWriterWaitingMutex.unlock(); // Release blocked readers, they will still hang at [3].
297 mHoldersCount = -1; // We are a writer now (will cause a hang at [5], see [4]).
298 mNoHoldersCondition.unlock(); // Release lock on mHolders (readers go from [3] to [5]).
299 }
300 void wrunlock(void)
301 {
302 mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount.
303 mHoldersCount = 0; // We have no writer anymore.
304 mNoHoldersCondition.signal(); // Tell waiting threads, see [5], [6] and [7].
305 mNoHoldersCondition.unlock(); // Release lock on mHoldersCount.
306 }
307 void rd2wrlock(void)
308 {
309 mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount. Blocks new readers at [3].
310 if (--mHoldersCount > 0) // Any other reads left?
311 {
312 mWriterWaitingMutex.lock(); // Block new readers, see [2],
313 mWriterIsWaiting = true; // from this moment on, see [1].
314 while (mHoldersCount != 0) // Other readers (still) have this lock?
315 {
316 mNoHoldersCondition.wait(); // [7] Wait till mHoldersCount is (or just was) 0.
317 }
318 mWriterIsWaiting = false; // Stop checking the lock for new readers, see [1].
319 mWriterWaitingMutex.unlock(); // Release blocked readers, they will still hang at [3].
320 }
321 mHoldersCount = -1; // We are a writer now (will cause a hang at [5], see [4]).
322 mNoHoldersCondition.unlock(); // Release lock on mHolders (readers go from [3] to [5]).
323 }
324 void wr2rdlock(void)
325 {
326 mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount.
327 mHoldersCount = 1; // Turn writer into a reader.
328 mNoHoldersCondition.signal(); // Tell waiting readers, see [5].
329 mNoHoldersCondition.unlock(); // Release lock on mHoldersCount.
330 }
176}; 331};
177 332
178//============================================================================ 333//============================================================================
@@ -187,7 +342,6 @@ void LLThread::unlockData()
187 mRunCondition->unlock(); 342 mRunCondition->unlock();
188} 343}
189 344
190
191//============================================================================ 345//============================================================================
192 346
193// see llmemory.h for LLPointer<> definition 347// see llmemory.h for LLPointer<> definition
diff --git a/linden/indra/llcommon/llworkerthread.cpp b/linden/indra/llcommon/llworkerthread.cpp
index 8195e1c..e238a89 100644
--- a/linden/indra/llcommon/llworkerthread.cpp
+++ b/linden/indra/llcommon/llworkerthread.cpp
@@ -43,7 +43,7 @@
43LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded) : 43LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded) :
44 LLQueuedThread(name, threaded) 44 LLQueuedThread(name, threaded)
45{ 45{
46 mDeleteMutex = new LLMutex(NULL); 46 mDeleteMutex = new LLMutex;
47} 47}
48 48
49LLWorkerThread::~LLWorkerThread() 49LLWorkerThread::~LLWorkerThread()
@@ -183,7 +183,6 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
183 : mWorkerThread(workerthread), 183 : mWorkerThread(workerthread),
184 mWorkerClassName(name), 184 mWorkerClassName(name),
185 mRequestHandle(LLWorkerThread::nullHandle()), 185 mRequestHandle(LLWorkerThread::nullHandle()),
186 mMutex(NULL),
187 mWorkFlags(0) 186 mWorkFlags(0)
188{ 187{
189 if (!mWorkerThread) 188 if (!mWorkerThread)
diff --git a/linden/indra/llcommon/llworkerthread.h b/linden/indra/llcommon/llworkerthread.h
index 33d4c40..8e0dd8a 100644
--- a/linden/indra/llcommon/llworkerthread.h
+++ b/linden/indra/llcommon/llworkerthread.h
@@ -194,7 +194,7 @@ protected:
194 U32 mRequestPriority; // last priority set 194 U32 mRequestPriority; // last priority set
195 195
196private: 196private:
197 LLMutex mMutex; 197 LLMutexRootPool mMutex; // Use LLMutexRootPool since this object is created and destructed by multiple threads.
198 LLAtomicU32 mWorkFlags; 198 LLAtomicU32 mWorkFlags;
199}; 199};
200 200
diff --git a/linden/indra/llcrashlogger/llcrashlogger.cpp b/linden/indra/llcrashlogger/llcrashlogger.cpp
index 69e0adb..a399a48 100755
--- a/linden/indra/llcrashlogger/llcrashlogger.cpp
+++ b/linden/indra/llcrashlogger/llcrashlogger.cpp
@@ -387,8 +387,7 @@ bool LLCrashLogger::init()
387 return false; 387 return false;
388 } 388 }
389 389
390 gServicePump = new LLPumpIO(gAPRPoolp); 390 gServicePump = new LLPumpIO;
391 gServicePump->prime(gAPRPoolp);
392 LLHTTPClient::setPump(*gServicePump); 391 LLHTTPClient::setPump(*gServicePump);
393 392
394 //If we've opened the crash logger, assume we can delete the marker file if it exists 393 //If we've opened the crash logger, assume we can delete the marker file if it exists
diff --git a/linden/indra/llimage/llimage.cpp b/linden/indra/llimage/llimage.cpp
index 776c481..e933750 100644
--- a/linden/indra/llimage/llimage.cpp
+++ b/linden/indra/llimage/llimage.cpp
@@ -57,7 +57,7 @@ LLMutex* LLImage::sMutex = NULL;
57//static 57//static
58void LLImage::initClass(const bool& useDSO) 58void LLImage::initClass(const bool& useDSO)
59{ 59{
60 sMutex = new LLMutex(NULL); 60 sMutex = new LLMutex;
61 if (useDSO) 61 if (useDSO)
62 { 62 {
63 LLImageJ2C::openDSO(); 63 LLImageJ2C::openDSO();
diff --git a/linden/indra/llimage/llimagej2c.cpp b/linden/indra/llimage/llimagej2c.cpp
index b99ebff..9e88bcd 100644
--- a/linden/indra/llimage/llimagej2c.cpp
+++ b/linden/indra/llimage/llimagej2c.cpp
@@ -46,7 +46,7 @@ typedef const char* (*EngineInfoLLImageJ2CFunction)();
46CreateLLImageJ2CFunction j2cimpl_create_func; 46CreateLLImageJ2CFunction j2cimpl_create_func;
47DestroyLLImageJ2CFunction j2cimpl_destroy_func; 47DestroyLLImageJ2CFunction j2cimpl_destroy_func;
48EngineInfoLLImageJ2CFunction j2cimpl_engineinfo_func; 48EngineInfoLLImageJ2CFunction j2cimpl_engineinfo_func;
49apr_pool_t *j2cimpl_dso_memory_pool; 49AIAPRPool j2cimpl_dso_memory_pool;
50apr_dso_handle_t *j2cimpl_dso_handle; 50apr_dso_handle_t *j2cimpl_dso_handle;
51 51
52//Declare the prototype for theses functions here, their functionality 52//Declare the prototype for theses functions here, their functionality
@@ -81,13 +81,12 @@ void LLImageJ2C::openDSO()
81 gDirUtilp->getExecutableDir()); 81 gDirUtilp->getExecutableDir());
82 82
83 j2cimpl_dso_handle = NULL; 83 j2cimpl_dso_handle = NULL;
84 j2cimpl_dso_memory_pool = NULL; 84 j2cimpl_dso_memory_pool.create();
85 85
86 //attempt to load the shared library 86 //attempt to load the shared library
87 apr_pool_create(&j2cimpl_dso_memory_pool, NULL);
88 rv = apr_dso_load(&j2cimpl_dso_handle, 87 rv = apr_dso_load(&j2cimpl_dso_handle,
89 dso_path.c_str(), 88 dso_path.c_str(),
90 j2cimpl_dso_memory_pool); 89 j2cimpl_dso_memory_pool());
91 90
92 //now, check for success 91 //now, check for success
93 if ( rv == APR_SUCCESS ) 92 if ( rv == APR_SUCCESS )
@@ -151,11 +150,7 @@ void LLImageJ2C::openDSO()
151 j2cimpl_dso_handle = NULL; 150 j2cimpl_dso_handle = NULL;
152 } 151 }
153 152
154 if ( j2cimpl_dso_memory_pool ) 153 j2cimpl_dso_memory_pool.destroy();
155 {
156 apr_pool_destroy(j2cimpl_dso_memory_pool);
157 j2cimpl_dso_memory_pool = NULL;
158 }
159 } 154 }
160} 155}
161 156
@@ -163,7 +158,7 @@ void LLImageJ2C::openDSO()
163void LLImageJ2C::closeDSO() 158void LLImageJ2C::closeDSO()
164{ 159{
165 if ( j2cimpl_dso_handle ) apr_dso_unload(j2cimpl_dso_handle); 160 if ( j2cimpl_dso_handle ) apr_dso_unload(j2cimpl_dso_handle);
166 if (j2cimpl_dso_memory_pool) apr_pool_destroy(j2cimpl_dso_memory_pool); 161 j2cimpl_dso_memory_pool.destroy();
167} 162}
168 163
169//static 164//static
diff --git a/linden/indra/llimage/llimageworker.cpp b/linden/indra/llimage/llimageworker.cpp
index 558a968..dc989e5 100644
--- a/linden/indra/llimage/llimageworker.cpp
+++ b/linden/indra/llimage/llimageworker.cpp
@@ -41,14 +41,13 @@
41LLImageDecodeThread::LLImageDecodeThread(bool threaded) 41LLImageDecodeThread::LLImageDecodeThread(bool threaded)
42 : LLQueuedThread("imagedecode", threaded) 42 : LLQueuedThread("imagedecode", threaded)
43{ 43{
44 mCreationMutex = new LLMutex(getAPRPool());
45} 44}
46 45
47// MAIN THREAD 46// MAIN THREAD
48// virtual 47// virtual
49S32 LLImageDecodeThread::update(U32 max_time_ms) 48S32 LLImageDecodeThread::update(U32 max_time_ms)
50{ 49{
51 LLMutexLock lock(mCreationMutex); 50 LLMutexLock lock(&mCreationMutex);
52 for (creation_list_t::iterator iter = mCreationList.begin(); 51 for (creation_list_t::iterator iter = mCreationList.begin();
53 iter != mCreationList.end(); ++iter) 52 iter != mCreationList.end(); ++iter)
54 { 53 {
@@ -71,7 +70,7 @@ S32 LLImageDecodeThread::update(U32 max_time_ms)
71LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image, 70LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image,
72 U32 priority, S32 discard, BOOL needs_aux, Responder* responder) 71 U32 priority, S32 discard, BOOL needs_aux, Responder* responder)
73{ 72{
74 LLMutexLock lock(mCreationMutex); 73 LLMutexLock lock(&mCreationMutex);
75 handle_t handle = generateHandle(); 74 handle_t handle = generateHandle();
76 mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder)); 75 mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
77 return handle; 76 return handle;
@@ -81,7 +80,7 @@ LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted*
81// Returns the size of the mutex guarded list as an indication of sanity 80// Returns the size of the mutex guarded list as an indication of sanity
82S32 LLImageDecodeThread::tut_size() 81S32 LLImageDecodeThread::tut_size()
83{ 82{
84 LLMutexLock lock(mCreationMutex); 83 LLMutexLock lock(&mCreationMutex);
85 S32 res = mCreationList.size(); 84 S32 res = mCreationList.size();
86 return res; 85 return res;
87} 86}
diff --git a/linden/indra/llimage/llimageworker.h b/linden/indra/llimage/llimageworker.h
index 0260206..fa2a8fa 100644
--- a/linden/indra/llimage/llimageworker.h
+++ b/linden/indra/llimage/llimageworker.h
@@ -101,7 +101,7 @@ private:
101 }; 101 };
102 typedef std::list<creation_info> creation_list_t; 102 typedef std::list<creation_info> creation_list_t;
103 creation_list_t mCreationList; 103 creation_list_t mCreationList;
104 LLMutex* mCreationMutex; 104 LLMutex mCreationMutex;
105}; 105};
106 106
107#endif 107#endif
diff --git a/linden/indra/llmath/llvolumemgr.cpp b/linden/indra/llmath/llvolumemgr.cpp
index 53641fc..8bfebcb 100644
--- a/linden/indra/llmath/llvolumemgr.cpp
+++ b/linden/indra/llmath/llvolumemgr.cpp
@@ -55,7 +55,7 @@ LLVolumeMgr::LLVolumeMgr()
55{ 55{
56 // the LLMutex magic interferes with easy unit testing, 56 // the LLMutex magic interferes with easy unit testing,
57 // so you now must manually call useMutex() to use it 57 // so you now must manually call useMutex() to use it
58 //mDataMutex = new LLMutex(gAPRPoolp); 58 //mDataMutex = new LLMutex;
59} 59}
60 60
61LLVolumeMgr::~LLVolumeMgr() 61LLVolumeMgr::~LLVolumeMgr()
@@ -222,7 +222,7 @@ void LLVolumeMgr::useMutex()
222{ 222{
223 if (!mDataMutex) 223 if (!mDataMutex)
224 { 224 {
225 mDataMutex = new LLMutex(gAPRPoolp); 225 mDataMutex = new LLMutex;
226 } 226 }
227} 227}
228 228
diff --git a/linden/indra/llmessage/CMakeLists.txt b/linden/indra/llmessage/CMakeLists.txt
index a5e4249..9965191 100644
--- a/linden/indra/llmessage/CMakeLists.txt
+++ b/linden/indra/llmessage/CMakeLists.txt
@@ -22,6 +22,7 @@ include_directories(
22set(llmessage_SOURCE_FILES 22set(llmessage_SOURCE_FILES
23 llares.cpp 23 llares.cpp
24 llassetstorage.cpp 24 llassetstorage.cpp
25 llavatarnamecache.cpp
25 llblowfishcipher.cpp 26 llblowfishcipher.cpp
26 llbuffer.cpp 27 llbuffer.cpp
27 llbufferstream.cpp 28 llbufferstream.cpp
@@ -105,6 +106,7 @@ set(llmessage_HEADER_FILES
105 106
106 llares.h 107 llares.h
107 llassetstorage.h 108 llassetstorage.h
109 llavatarnamecache.h
108 llblowfishcipher.h 110 llblowfishcipher.h
109 llbuffer.h 111 llbuffer.h
110 llbufferstream.h 112 llbufferstream.h
diff --git a/linden/indra/llmessage/llares.cpp b/linden/indra/llmessage/llares.cpp
index fe37fe8..5a6794e 100644
--- a/linden/indra/llmessage/llares.cpp
+++ b/linden/indra/llmessage/llares.cpp
@@ -43,6 +43,7 @@
43 43
44#include "llapr.h" 44#include "llapr.h"
45#include "llares.h" 45#include "llares.h"
46#include "llscopedvolatileaprpool.h"
46 47
47#if defined(LL_WINDOWS) 48#if defined(LL_WINDOWS)
48# define ns_c_in 1 49# define ns_c_in 1
@@ -463,11 +464,6 @@ void LLAres::search(const std::string &query, LLResType type,
463 464
464bool LLAres::process(U64 timeout) 465bool LLAres::process(U64 timeout)
465{ 466{
466 if (!gAPRPoolp)
467 {
468 ll_init_apr();
469 }
470
471 int socks[ARES_GETSOCK_MAXNUM]; 467 int socks[ARES_GETSOCK_MAXNUM];
472 apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM]; 468 apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM];
473 apr_int32_t nsds = 0; 469 apr_int32_t nsds = 0;
@@ -481,10 +477,7 @@ bool LLAres::process(U64 timeout)
481 return nsds > 0; 477 return nsds > 0;
482 } 478 }
483 479
484 apr_status_t status; 480 LLScopedVolatileAPRPool scoped_pool;
485 LLAPRPool pool;
486 status = pool.getStatus() ;
487 ll_apr_assert_status(status);
488 481
489 for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++) 482 for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++)
490 { 483 {
@@ -501,7 +494,7 @@ bool LLAres::process(U64 timeout)
501 494
502 apr_socket_t *aprSock = NULL; 495 apr_socket_t *aprSock = NULL;
503 496
504 status = apr_os_sock_put(&aprSock, (apr_os_sock_t *) &socks[i], pool.getAPRPool()); 497 apr_status_t status = apr_os_sock_put(&aprSock, (apr_os_sock_t *) &socks[i], scoped_pool);
505 if (status != APR_SUCCESS) 498 if (status != APR_SUCCESS)
506 { 499 {
507 ll_apr_warn_status(status); 500 ll_apr_warn_status(status);
@@ -510,7 +503,7 @@ bool LLAres::process(U64 timeout)
510 503
511 aprFds[nactive].desc.s = aprSock; 504 aprFds[nactive].desc.s = aprSock;
512 aprFds[nactive].desc_type = APR_POLL_SOCKET; 505 aprFds[nactive].desc_type = APR_POLL_SOCKET;
513 aprFds[nactive].p = pool.getAPRPool(); 506 aprFds[nactive].p = scoped_pool;
514 aprFds[nactive].rtnevents = 0; 507 aprFds[nactive].rtnevents = 0;
515 aprFds[nactive].client_data = &socks[i]; 508 aprFds[nactive].client_data = &socks[i];
516 509
@@ -519,7 +512,7 @@ bool LLAres::process(U64 timeout)
519 512
520 if (nactive > 0) 513 if (nactive > 0)
521 { 514 {
522 status = apr_poll(aprFds, nactive, &nsds, timeout); 515 apr_status_t status = apr_poll(aprFds, nactive, &nsds, timeout);
523 516
524 if (status != APR_SUCCESS && status != APR_TIMEUP) 517 if (status != APR_SUCCESS && status != APR_TIMEUP)
525 { 518 {
diff --git a/linden/indra/llmessage/llavatarnamecache.cpp b/linden/indra/llmessage/llavatarnamecache.cpp
new file mode 100644
index 0000000..180274e
--- /dev/null
+++ b/linden/indra/llmessage/llavatarnamecache.cpp
@@ -0,0 +1,859 @@
1/**
2 * @file llavatarnamecache.cpp
3 * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names
4 * ("James Cook") from avatar UUIDs.
5 *
6 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
7 * Second Life Viewer Source Code
8 * Copyright (C) 2010, Linden Research, Inc.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation;
13 * version 2.1 of the License only.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
25 * $/LicenseInfo$
26 */
27#include "linden_common.h"
28
29#include "llavatarnamecache.h"
30
31#include "llcachename.h" // we wrap this system
32#include "llframetimer.h"
33#include "llhttpclient.h"
34#include "llsd.h"
35#include "llsdserialize.h"
36
37#include <boost/tokenizer.hpp>
38
39#include <map>
40#include <set>
41
42namespace LLAvatarNameCache
43{
44 use_display_name_signal_t mUseDisplayNamesSignal;
45
46 // Manual override for display names: 0 = legacy names,
47 // 1 = display name and legacy name, 2 = display name (legacy if absent)
48 U32 sUseDisplayNames = 0;
49
50 // Cache starts in a paused state until we can determine if the
51 // current region supports display names.
52 bool sRunning = false;
53
54 // Base lookup URL for name service.
55 // On simulator, loaded from indra.xml
56 // On viewer, usually a simulator capability (at People API team's request)
57 // Includes the trailing slash, like "http://pdp60.lindenlab.com:8000/agents/"
58 std::string sNameLookupURL;
59
60 // accumulated agent IDs for next query against service
61 typedef std::set<LLUUID> ask_queue_t;
62 ask_queue_t sAskQueue;
63
64 // agent IDs that have been requested, but with no reply
65 // maps agent ID to frame time request was made
66 typedef std::map<LLUUID, F64> pending_queue_t;
67 pending_queue_t sPendingQueue;
68
69 // Callbacks to fire when we received a name.
70 // May have multiple callbacks for a single ID, which are
71 // represented as multiple slots bound to the signal.
72 // Avoid copying signals via pointers.
73 typedef std::map<LLUUID, callback_signal_t*> signal_map_t;
74 signal_map_t sSignalMap;
75
76 // names we know about
77 typedef std::map<LLUUID, LLAvatarName> cache_t;
78 cache_t sCache;
79
80 // Send bulk lookup requests a few times a second at most
81 // only need per-frame timing resolution
82 LLFrameTimer sRequestTimer;
83
84 // Periodically clean out expired entries from the cache
85 //LLFrameTimer sEraseExpiredTimer;
86
87 //-----------------------------------------------------------------------
88 // Internal methods
89 //-----------------------------------------------------------------------
90
91 // Handle name response off network.
92 // Optionally skip adding to cache, used when this is a fallback to the
93 // legacy name system.
94 void processName(const LLUUID& agent_id,
95 const LLAvatarName& av_name,
96 bool add_to_cache);
97
98 void requestNamesViaCapability();
99
100 // Legacy name system callback
101 void legacyNameCallback(const LLUUID& agent_id,
102 const std::string& first, const std::string& last,
103 BOOL is_group, void* data);
104
105 void requestNamesViaLegacy();
106
107 // Fill in an LLAvatarName with the legacy name data
108 void buildLegacyName(const std::string& full_name,
109 LLAvatarName* av_name);
110
111 // Do a single callback to a given slot
112 void fireSignal(const LLUUID& agent_id,
113 const callback_slot_t& slot,
114 const LLAvatarName& av_name);
115
116 // Is a request in-flight over the network?
117 bool isRequestPending(const LLUUID& agent_id);
118
119 // Erase expired names from cache
120 void eraseExpired();
121
122 bool expirationFromCacheControl(LLSD headers, F64 *expires);
123}
124
125/* Sample response:
126<?xml version="1.0"?>
127<llsd>
128 <map>
129 <key>agents</key>
130 <array>
131 <map>
132 <key>display_name_next_update</key>
133 <date>2010-04-16T21:34:02+00:00Z</date>
134 <key>display_name_expires</key>
135 <date>2010-04-16T21:32:26.142178+00:00Z</date>
136 <key>display_name</key>
137 <string>MickBot390 LLQABot</string>
138 <key>sl_id</key>
139 <string>mickbot390.llqabot</string>
140 <key>id</key>
141 <string>0012809d-7d2d-4c24-9609-af1230a37715</string>
142 <key>is_display_name_default</key>
143 <boolean>false</boolean>
144 </map>
145 <map>
146 <key>display_name_next_update</key>
147 <date>2010-04-16T21:34:02+00:00Z</date>
148 <key>display_name_expires</key>
149 <date>2010-04-16T21:32:26.142178+00:00Z</date>
150 <key>display_name</key>
151 <string>Bjork Gudmundsdottir</string>
152 <key>sl_id</key>
153 <string>sardonyx.linden</string>
154 <key>id</key>
155 <string>3941037e-78ab-45f0-b421-bd6e77c1804d</string>
156 <key>is_display_name_default</key>
157 <boolean>true</boolean>
158 </map>
159 </array>
160 </map>
161</llsd>
162*/
163
164class LLAvatarNameResponder : public LLHTTPClient::Responder
165{
166private:
167 // need to store agent ids that are part of this request in case of
168 // an error, so we can flag them as unavailable
169 std::vector<LLUUID> mAgentIDs;
170
171 // Need the headers to look up Expires: and Retry-After:
172 LLSD mHeaders;
173
174public:
175 LLAvatarNameResponder(const std::vector<LLUUID>& agent_ids)
176 : mAgentIDs(agent_ids),
177 mHeaders()
178 { }
179
180 /*virtual*/ void completedHeader(U32 status, const std::string& reason,
181 const LLSD& headers)
182 {
183 mHeaders = headers;
184 }
185
186 /*virtual*/ void result(const LLSD& content)
187 {
188 // Pull expiration out of headers if available
189 F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders);
190
191 LLSD agents = content["agents"];
192 LLSD::array_const_iterator it;
193 for (it = agents.beginArray(); it != agents.endArray(); ++it)
194 {
195 const LLSD& row = *it;
196 LLUUID agent_id = row["id"].asUUID();
197
198 LLAvatarName av_name;
199 av_name.fromLLSD(row);
200
201 // Use expiration time from header
202 av_name.mExpires = expires;
203
204 // Some avatars don't have explicit display names set
205 if (av_name.mDisplayName.empty())
206 {
207 av_name.mDisplayName = av_name.mUsername;
208 }
209
210 // cache it and fire signals
211 LLAvatarNameCache::processName(agent_id, av_name, true);
212 }
213
214 // Same logic as error response case
215 LLSD unresolved_agents = content["bad_ids"];
216 if (unresolved_agents.size() > 0)
217 {
218 std::string first, last;
219 LLAvatarName av_name;
220 av_name.mIsDisplayNameDefault = false;
221 av_name.mIsDummy = true;
222 av_name.mExpires = expires;
223
224 for (it = unresolved_agents.beginArray(); it != unresolved_agents.endArray(); ++it)
225 {
226 const LLUUID& agent_id = *it;
227 gCacheName->getName(agent_id, first, last);
228 av_name.mLegacyFirstName = first;
229 av_name.mLegacyLastName = last;
230 av_name.mDisplayName = first;
231 if (last == "Resident")
232 {
233 av_name.mDisplayName = first;
234 av_name.mUsername = first;
235 }
236 else
237 {
238 av_name.mDisplayName = first + " " + last;
239 av_name.mUsername = first + "." + last;
240 }
241 LLStringUtil::toLower(av_name.mUsername);
242 // cache it and fire signals
243 LLAvatarNameCache::processName(agent_id, av_name, true);
244 }
245 }
246 }
247
248 /*virtual*/ void error(U32 status, const std::string& reason)
249 {
250 // We're going to construct a dummy record and cache it for a while,
251 // either briefly for a 503 Service Unavailable, or longer for other
252 // errors.
253 F64 retry_timestamp = errorRetryTimestamp(status);
254
255 std::string first, last;
256 LLAvatarName av_name;
257 av_name.mIsDisplayNameDefault = false;
258 av_name.mIsDummy = true;
259 av_name.mExpires = retry_timestamp;
260
261 // Add dummy records for all agent IDs in this request
262 std::vector<LLUUID>::const_iterator it;
263 for (it = mAgentIDs.begin(); it != mAgentIDs.end(); ++it)
264 {
265 const LLUUID& agent_id = *it;
266 gCacheName->getName(agent_id, first, last);
267 av_name.mLegacyFirstName = first;
268 av_name.mLegacyLastName = last;
269 av_name.mDisplayName = first;
270 if (last == "Resident")
271 {
272 av_name.mDisplayName = first;
273 av_name.mUsername = first;
274 }
275 else
276 {
277 av_name.mDisplayName = first + " " + last;
278 av_name.mUsername = first + "." + last;
279 }
280 LLStringUtil::toLower(av_name.mUsername);
281 // cache it and fire signals
282 LLAvatarNameCache::processName(agent_id, av_name, true);
283 }
284 }
285
286 // Return time to retry a request that generated an error, based on
287 // error type and headers. Return value is seconds-since-epoch.
288 F64 errorRetryTimestamp(S32 status)
289 {
290 F64 now = LLFrameTimer::getTotalSeconds();
291
292 // Retry-After takes priority
293 LLSD retry_after = mHeaders["retry-after"];
294 if (retry_after.isDefined())
295 {
296 // We only support the delta-seconds type
297 S32 delta_seconds = retry_after.asInteger();
298 if (delta_seconds > 0)
299 {
300 // ...valid delta-seconds
301 return now + F64(delta_seconds);
302 }
303 }
304
305 // If no Retry-After, look for Cache-Control max-age
306 F64 expires = 0.0;
307 if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires))
308 {
309 return expires;
310 }
311
312 // No information in header, make a guess
313 if (status == 503)
314 {
315 // ...service unavailable, retry soon
316 const F64 SERVICE_UNAVAILABLE_DELAY = 600.0; // 10 min
317 return now + SERVICE_UNAVAILABLE_DELAY;
318 }
319 else
320 {
321 // ...other unexpected error
322 const F64 DEFAULT_DELAY = 3600.0; // 1 hour
323 return now + DEFAULT_DELAY;
324 }
325 }
326};
327
328void LLAvatarNameCache::processName(const LLUUID& agent_id,
329 const LLAvatarName& av_name,
330 bool add_to_cache)
331{
332 if (add_to_cache)
333 {
334 sCache[agent_id] = av_name;
335 }
336
337 sPendingQueue.erase(agent_id);
338
339 // signal everyone waiting on this name
340 signal_map_t::iterator sig_it = sSignalMap.find(agent_id);
341 if (sig_it != sSignalMap.end())
342 {
343 callback_signal_t* signal = sig_it->second;
344 (*signal)(agent_id, av_name);
345
346 sSignalMap.erase(agent_id);
347
348 delete signal;
349 signal = NULL;
350 }
351}
352
353void LLAvatarNameCache::requestNamesViaCapability()
354{
355 F64 now = LLFrameTimer::getTotalSeconds();
356
357 // URL format is like:
358 // http://pdp60.lindenlab.com:8000/agents/?ids=3941037e-78ab-45f0-b421-bd6e77c1804d&ids=0012809d-7d2d-4c24-9609-af1230a37715&ids=0019aaba-24af-4f0a-aa72-6457953cf7f0
359 //
360 // Apache can handle URLs of 4096 chars, but let's be conservative
361 const U32 NAME_URL_MAX = 4096;
362 const U32 NAME_URL_SEND_THRESHOLD = 3000;
363 std::string url;
364 url.reserve(NAME_URL_MAX);
365
366 std::vector<LLUUID> agent_ids;
367 agent_ids.reserve(128);
368
369 ask_queue_t::const_iterator it = sAskQueue.begin();
370 for ( ; it != sAskQueue.end(); ++it)
371 {
372 const LLUUID& agent_id = *it;
373
374 if (url.empty())
375 {
376 // ...starting new request
377 url += sNameLookupURL;
378 url += "?ids=";
379 }
380 else
381 {
382 // ...continuing existing request
383 url += "&ids=";
384 }
385 url += agent_id.asString();
386 agent_ids.push_back(agent_id);
387
388 // mark request as pending
389 sPendingQueue[agent_id] = now;
390
391 if (url.size() > NAME_URL_SEND_THRESHOLD)
392 {
393 //llinfos << "requestNames " << url << llendl;
394 LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
395 url.clear();
396 agent_ids.clear();
397 }
398 }
399
400 if (!url.empty())
401 {
402 //llinfos << "requestNames " << url << llendl;
403 LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
404 url.clear();
405 agent_ids.clear();
406 }
407
408 // We've moved all asks to the pending request queue
409 sAskQueue.clear();
410}
411
412void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id,
413 const std::string& first, const std::string& last,
414 BOOL is_group, void* data)
415{
416 std::string full_name = first + " " + last;
417 // Construct a dummy record for this name. By convention, SLID is blank
418 // Never expires, but not written to disk, so lasts until end of session.
419 LLAvatarName av_name;
420 buildLegacyName(full_name, &av_name);
421
422 // Don't add to cache, the data already exists in the legacy name system
423 // cache and we don't want or need duplicate storage, because keeping the
424 // two copies in sync is complex.
425 processName(agent_id, av_name, false);
426}
427
428void LLAvatarNameCache::requestNamesViaLegacy()
429{
430 F64 now = LLFrameTimer::getTotalSeconds();
431 std::string full_name;
432 ask_queue_t::const_iterator it = sAskQueue.begin();
433 for (; it != sAskQueue.end(); ++it)
434 {
435 const LLUUID& agent_id = *it;
436
437 // Mark as pending first, just in case the callback is immediately
438 // invoked below. This should never happen in practice.
439 sPendingQueue[agent_id] = now;
440
441 gCacheName->get(agent_id, false, legacyNameCallback);
442 }
443
444 // We've either answered immediately or moved all asks to the
445 // pending queue
446 sAskQueue.clear();
447}
448
449void LLAvatarNameCache::initClass(bool running)
450{
451 sRunning = running;
452}
453
454void LLAvatarNameCache::cleanupClass()
455{
456}
457
458void LLAvatarNameCache::importFile(std::istream& istr)
459{
460 LLSD data;
461 S32 parse_count = LLSDSerialize::fromXMLDocument(data, istr);
462 if (parse_count < 1) return;
463
464 // by convention LLSD storage is a map
465 // we only store one entry in the map
466 LLSD agents = data["agents"];
467
468 LLUUID agent_id;
469 LLAvatarName av_name;
470 LLSD::map_const_iterator it = agents.beginMap();
471 for ( ; it != agents.endMap(); ++it)
472 {
473 agent_id.set(it->first);
474 av_name.fromLLSD( it->second );
475 sCache[agent_id] = av_name;
476 }
477 // entries may have expired since we last ran the viewer, just
478 // clean them out now
479 eraseExpired();
480 llinfos << "loaded " << sCache.size() << llendl;
481}
482
483void LLAvatarNameCache::exportFile(std::ostream& ostr)
484{
485 LLSD agents;
486 cache_t::const_iterator it = sCache.begin();
487 for ( ; it != sCache.end(); ++it)
488 {
489 const LLUUID& agent_id = it->first;
490 const LLAvatarName& av_name = it->second;
491 if (!av_name.mIsDummy)
492 {
493 // key must be a string
494 agents[agent_id.asString()] = av_name.asLLSD();
495 }
496 }
497 LLSD data;
498 data["agents"] = agents;
499 LLSDSerialize::toPrettyXML(data, ostr);
500}
501
502void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url)
503{
504 sNameLookupURL = name_lookup_url;
505}
506
507bool LLAvatarNameCache::hasNameLookupURL()
508{
509 return !sNameLookupURL.empty();
510}
511
512void LLAvatarNameCache::idle()
513{
514 // By convention, start running at first idle() call
515 sRunning = true;
516
517 // *TODO: Possibly re-enabled this based on People API load measurements
518 // 100 ms is the threshold for "user speed" operations, so we can
519 // stall for about that long to batch up requests.
520 //const F32 SECS_BETWEEN_REQUESTS = 0.1f;
521 //if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS))
522 //{
523 // return;
524 //}
525
526 // Must be large relative to above
527
528 // No longer deleting expired entries, just re-requesting in the get
529 // this way first synchronous get call on an expired entry won't return
530 // legacy name. LF
531
532 //const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds
533 //if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
534 //{
535 // eraseExpired();
536 //}
537
538 if (sAskQueue.empty())
539 {
540 return;
541 }
542
543 if (useDisplayNames())
544 {
545 requestNamesViaCapability();
546 }
547 else
548 {
549 // ...fall back to legacy name cache system
550 requestNamesViaLegacy();
551 }
552}
553
554bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id)
555{
556 const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0;
557 F64 now = LLFrameTimer::getTotalSeconds();
558 F64 expire_time = now - PENDING_TIMEOUT_SECS;
559
560 pending_queue_t::const_iterator it = sPendingQueue.find(agent_id);
561 if (it != sPendingQueue.end())
562 {
563 bool request_expired = (it->second < expire_time);
564 return !request_expired;
565 }
566 return false;
567}
568
569void LLAvatarNameCache::eraseExpired()
570{
571 F64 now = LLFrameTimer::getTotalSeconds();
572 cache_t::iterator it = sCache.begin();
573 while (it != sCache.end())
574 {
575 cache_t::iterator cur = it;
576 ++it;
577 const LLAvatarName& av_name = cur->second;
578 if (av_name.mExpires < now)
579 {
580 sCache.erase(cur);
581 }
582 }
583}
584
585void LLAvatarNameCache::buildLegacyName(const std::string& full_name,
586 LLAvatarName* av_name)
587{
588 llassert(av_name);
589 av_name->mUsername = "";
590 av_name->mDisplayName = full_name;
591 av_name->mIsDisplayNameDefault = true;
592 av_name->mIsDummy = true;
593 av_name->mExpires = F64_MAX;
594}
595
596// fills in av_name if it has it in the cache, even if expired (can check expiry time)
597// returns bool specifying if av_name was filled, false otherwise
598bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)
599{
600 if (sRunning)
601 {
602 // ...only do immediate lookups when cache is running
603 if (useDisplayNames())
604 {
605 // ...use display names cache
606 std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id);
607 if (it != sCache.end())
608 {
609 *av_name = it->second;
610
611 // re-request name if entry is expired
612 if (av_name->mExpires < LLFrameTimer::getTotalSeconds())
613 {
614 if (!isRequestPending(agent_id))
615 {
616 sAskQueue.insert(agent_id);
617 }
618 }
619
620 return true;
621 }
622 }
623 else
624 {
625 // ...use legacy names cache
626 std::string full_name;
627 if (gCacheName->getFullName(agent_id, full_name))
628 {
629 buildLegacyName(full_name, av_name);
630 return true;
631 }
632 }
633 }
634
635 if (!isRequestPending(agent_id))
636 {
637 sAskQueue.insert(agent_id);
638 }
639
640 return false;
641}
642
643void LLAvatarNameCache::fireSignal(const LLUUID& agent_id,
644 const callback_slot_t& slot,
645 const LLAvatarName& av_name)
646{
647 callback_signal_t signal;
648 signal.connect(slot);
649 signal(agent_id, av_name);
650}
651
652void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
653{
654 if (sRunning)
655 {
656 // ...only do immediate lookups when cache is running
657 if (useDisplayNames())
658 {
659 // ...use new cache
660 std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id);
661 if (it != sCache.end())
662 {
663 const LLAvatarName& av_name = it->second;
664
665 if (av_name.mExpires > LLFrameTimer::getTotalSeconds())
666 {
667 // ...name already exists in cache, fire callback now
668 fireSignal(agent_id, slot, av_name);
669
670 return;
671 }
672 }
673 }
674 else
675 {
676 // ...use old name system
677 std::string full_name;
678 if (gCacheName->getFullName(agent_id, full_name))
679 {
680 LLAvatarName av_name;
681 buildLegacyName(full_name, &av_name);
682 fireSignal(agent_id, slot, av_name);
683 return;
684 }
685 }
686 }
687
688 // schedule a request
689 if (!isRequestPending(agent_id))
690 {
691 sAskQueue.insert(agent_id);
692 }
693
694 // always store additional callback, even if request is pending
695 signal_map_t::iterator sig_it = sSignalMap.find(agent_id);
696 if (sig_it == sSignalMap.end())
697 {
698 // ...new callback for this id
699 callback_signal_t* signal = new callback_signal_t();
700 signal->connect(slot);
701 sSignalMap[agent_id] = signal;
702 }
703 else
704 {
705 // ...existing callback, bind additional slot
706 callback_signal_t* signal = sig_it->second;
707 signal->connect(slot);
708 }
709}
710
711
712void LLAvatarNameCache::setUseDisplayNames(U32 use)
713{
714 if (use != sUseDisplayNames)
715 {
716 if (use > 2)
717 {
718 sUseDisplayNames = 2;
719 }
720 else
721 {
722 sUseDisplayNames = use;
723 }
724 // flush our cache
725 sCache.clear();
726
727 mUseDisplayNamesSignal();
728 }
729}
730
731U32 LLAvatarNameCache::useDisplayNames()
732{
733 // Must be both manually set on and able to look up names.
734 if (sNameLookupURL.empty())
735 {
736 return 0;
737 }
738 else
739 {
740 return sUseDisplayNames;
741 }
742}
743
744void LLAvatarNameCache::erase(const LLUUID& agent_id)
745{
746 sCache.erase(agent_id);
747}
748
749void LLAvatarNameCache::fetch(const LLUUID& agent_id)
750{
751 // re-request, even if request is already pending
752 sAskQueue.insert(agent_id);
753}
754
755void LLAvatarNameCache::insert(const LLUUID& agent_id, const LLAvatarName& av_name)
756{
757 // *TODO: update timestamp if zero?
758 sCache[agent_id] = av_name;
759}
760
761F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers)
762{
763 F64 expires = 0.0;
764 if (expirationFromCacheControl(headers, &expires))
765 {
766 return expires;
767 }
768 else
769 {
770 // With no expiration info, default to an hour
771 const F64 DEFAULT_EXPIRES = 60.0 * 60.0;
772 F64 now = LLFrameTimer::getTotalSeconds();
773 return now + DEFAULT_EXPIRES;
774 }
775}
776
777bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)
778{
779 // Allow the header to override the default
780 LLSD cache_control_header = headers["cache-control"];
781 if (cache_control_header.isDefined())
782 {
783 S32 max_age = 0;
784 std::string cache_control = cache_control_header.asString();
785 if (max_age_from_cache_control(cache_control, &max_age))
786 {
787 F64 now = LLFrameTimer::getTotalSeconds();
788 *expires = now + (F64)max_age;
789 return true;
790 }
791 }
792 return false;
793}
794
795
796void LLAvatarNameCache::addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb)
797{
798 mUseDisplayNamesSignal.connect(cb);
799}
800
801
802static const std::string MAX_AGE("max-age");
803static const boost::char_separator<char> EQUALS_SEPARATOR("=");
804static const boost::char_separator<char> COMMA_SEPARATOR(",");
805
806bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age)
807{
808 // Split the string on "," to get a list of directives
809 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
810 tokenizer directives(cache_control, COMMA_SEPARATOR);
811
812 tokenizer::iterator token_it = directives.begin();
813 for ( ; token_it != directives.end(); ++token_it)
814 {
815 // Tokens may have leading or trailing whitespace
816 std::string token = *token_it;
817 LLStringUtil::trim(token);
818
819 if (token.compare(0, MAX_AGE.size(), MAX_AGE) == 0)
820 {
821 // ...this token starts with max-age, so let's chop it up by "="
822 tokenizer subtokens(token, EQUALS_SEPARATOR);
823 tokenizer::iterator subtoken_it = subtokens.begin();
824
825 // Must have a token
826 if (subtoken_it == subtokens.end()) return false;
827 std::string subtoken = *subtoken_it;
828
829 // Must exactly equal "max-age"
830 LLStringUtil::trim(subtoken);
831 if (subtoken != MAX_AGE) return false;
832
833 // Must have another token
834 ++subtoken_it;
835 if (subtoken_it == subtokens.end()) return false;
836 subtoken = *subtoken_it;
837
838 // Must be a valid integer
839 // *NOTE: atoi() returns 0 for invalid values, so we have to
840 // check the string first.
841 // *TODO: Do servers ever send "0000" for zero? We don't handle it
842 LLStringUtil::trim(subtoken);
843 if (subtoken == "0")
844 {
845 *max_age = 0;
846 return true;
847 }
848 S32 val = atoi( subtoken.c_str() );
849 if (val > 0 && val < S32_MAX)
850 {
851 *max_age = val;
852 return true;
853 }
854 return false;
855 }
856 }
857 return false;
858}
859
diff --git a/linden/indra/llmessage/llavatarnamecache.h b/linden/indra/llmessage/llavatarnamecache.h
new file mode 100644
index 0000000..a2519cd
--- /dev/null
+++ b/linden/indra/llmessage/llavatarnamecache.h
@@ -0,0 +1,105 @@
1/**
2 * @file llavatarnamecache.h
3 * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names
4 * ("James Cook") from avatar UUIDs.
5 *
6 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
7 * Second Life Viewer Source Code
8 * Copyright (C) 2010, Linden Research, Inc.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation;
13 * version 2.1 of the License only.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
25 * $/LicenseInfo$
26 */
27
28#ifndef LLAVATARNAMECACHE_H
29#define LLAVATARNAMECACHE_H
30
31#include "llavatarname.h" // for convenience
32
33#include <boost/signals2.hpp>
34
35// We have display names support (this is for use by patches)
36#define LL_DISPLAY_NAMES
37
38class LLSD;
39class LLUUID;
40
41namespace LLAvatarNameCache
42{
43
44 typedef boost::signals2::signal<void (void)> use_display_name_signal_t;
45
46 // Until the cache is set running, immediate lookups will fail and
47 // async lookups will be queued. This allows us to block requests
48 // until we know if the first region supports display names.
49 void initClass(bool running);
50 void cleanupClass();
51
52 void importFile(std::istream& istr);
53 void exportFile(std::ostream& ostr);
54
55 // On the viewer, usually a simulator capabilitity
56 // If empty, name cache will fall back to using legacy name
57 // lookup system
58 void setNameLookupURL(const std::string& name_lookup_url);
59
60 // Do we have a valid lookup URL, hence are we trying to use the
61 // new display name lookup system?
62 bool hasNameLookupURL();
63
64 // Periodically makes a batch request for display names not already in
65 // cache. Call once per frame.
66 void idle();
67
68 // If name is in cache, returns true and fills in provided LLAvatarName
69 // otherwise returns false
70 bool get(const LLUUID& agent_id, LLAvatarName *av_name);
71
72 // Callback types for get() below
73 typedef boost::signals2::signal<
74 void (const LLUUID& agent_id, const LLAvatarName& av_name)>
75 callback_signal_t;
76 typedef callback_signal_t::slot_type callback_slot_t;
77
78 // Fetches name information and calls callback.
79 // If name information is in cache, callback will be called immediately.
80 void get(const LLUUID& agent_id, callback_slot_t slot);
81
82 void setUseDisplayNames(U32 use);
83 U32 useDisplayNames();
84
85 void erase(const LLUUID& agent_id);
86
87 // Force a re-fetch of the most recent data, but keep the current
88 // data in cache
89 void fetch(const LLUUID& agent_id);
90
91 void insert(const LLUUID& agent_id, const LLAvatarName& av_name);
92
93 // Compute name expiration time from HTTP Cache-Control header,
94 // or return default value, in seconds from epoch.
95 F64 nameExpirationFromHeaders(LLSD headers);
96
97 void addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb);
98}
99
100// Parse a cache-control header to get the max-age delta-seconds.
101// Returns true if header has max-age param and it parses correctly.
102// Exported here to ease unit testing.
103bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age);
104
105#endif
diff --git a/linden/indra/llmessage/llcachename.h b/linden/indra/llmessage/llcachename.h
index 2757b86..cb3cc1f 100644
--- a/linden/indra/llmessage/llcachename.h
+++ b/linden/indra/llmessage/llcachename.h
@@ -33,6 +33,8 @@
33#ifndef LL_LLCACHENAME_H 33#ifndef LL_LLCACHENAME_H
34#define LL_LLCACHENAME_H 34#define LL_LLCACHENAME_H
35 35
36#include "llavatarnamecache.h" // for convenience
37
36class LLMessageSystem; 38class LLMessageSystem;
37class LLHost; 39class LLHost;
38class LLUUID; 40class LLUUID;
diff --git a/linden/indra/llmessage/llcurl.cpp b/linden/indra/llmessage/llcurl.cpp
index 202332c..9ecfee4 100644
--- a/linden/indra/llmessage/llcurl.cpp
+++ b/linden/indra/llmessage/llcurl.cpp
@@ -1020,7 +1020,7 @@ void LLCurl::initClass()
1020 S32 mutex_count = CRYPTO_num_locks(); 1020 S32 mutex_count = CRYPTO_num_locks();
1021 for (S32 i=0; i<mutex_count; i++) 1021 for (S32 i=0; i<mutex_count; i++)
1022 { 1022 {
1023 sSSLMutex.push_back(new LLMutex(NULL)); 1023 sSSLMutex.push_back(new LLMutex);
1024 } 1024 }
1025 CRYPTO_set_id_callback(&LLCurl::ssl_thread_id); 1025 CRYPTO_set_id_callback(&LLCurl::ssl_thread_id);
1026 CRYPTO_set_locking_callback(&LLCurl::ssl_locking_callback); 1026 CRYPTO_set_locking_callback(&LLCurl::ssl_locking_callback);
diff --git a/linden/indra/llmessage/lliohttpserver.cpp b/linden/indra/llmessage/lliohttpserver.cpp
index 83dfa94..8ad052b 100644
--- a/linden/indra/llmessage/lliohttpserver.cpp
+++ b/linden/indra/llmessage/lliohttpserver.cpp
@@ -948,13 +948,9 @@ private:
948 948
949 949
950// static 950// static
951LLHTTPNode& LLIOHTTPServer::create( 951LLHTTPNode& LLIOHTTPServer::create(LLPumpIO& pump, U16 port)
952 apr_pool_t* pool, LLPumpIO& pump, U16 port)
953{ 952{
954 LLSocket::ptr_t socket = LLSocket::create( 953 LLSocket::ptr_t socket = LLSocket::create(LLSocket::STREAM_TCP, port);
955 pool,
956 LLSocket::STREAM_TCP,
957 port);
958 if(!socket) 954 if(!socket)
959 { 955 {
960 llerrs << "Unable to initialize socket" << llendl; 956 llerrs << "Unable to initialize socket" << llendl;
@@ -963,7 +959,7 @@ LLHTTPNode& LLIOHTTPServer::create(
963 LLHTTPResponseFactory* factory = new LLHTTPResponseFactory; 959 LLHTTPResponseFactory* factory = new LLHTTPResponseFactory;
964 boost::shared_ptr<LLChainIOFactory> factory_ptr(factory); 960 boost::shared_ptr<LLChainIOFactory> factory_ptr(factory);
965 961
966 LLIOServerSocket* server = new LLIOServerSocket(pool, socket, factory_ptr); 962 LLIOServerSocket* server = new LLIOServerSocket(socket, factory_ptr);
967 963
968 LLPumpIO::chain_t chain; 964 LLPumpIO::chain_t chain;
969 chain.push_back(LLIOPipe::ptr_t(server)); 965 chain.push_back(LLIOPipe::ptr_t(server));
diff --git a/linden/indra/llmessage/lliohttpserver.h b/linden/indra/llmessage/lliohttpserver.h
index d1c9bdd..d2a8e2a 100644
--- a/linden/indra/llmessage/lliohttpserver.h
+++ b/linden/indra/llmessage/lliohttpserver.h
@@ -57,7 +57,7 @@ class LLIOHTTPServer
57public: 57public:
58 typedef void (*timing_callback_t)(const char* hashed_name, F32 time, void* data); 58 typedef void (*timing_callback_t)(const char* hashed_name, F32 time, void* data);
59 59
60 static LLHTTPNode& create(apr_pool_t* pool, LLPumpIO& pump, U16 port); 60 static LLHTTPNode& create(LLPumpIO& pump, U16 port);
61 /**< Creates an HTTP wire server on the pump for the given TCP port. 61 /**< Creates an HTTP wire server on the pump for the given TCP port.
62 * 62 *
63 * Returns the root node of the new server. Add LLHTTPNode instances 63 * Returns the root node of the new server. Add LLHTTPNode instances
diff --git a/linden/indra/llmessage/lliosocket.cpp b/linden/indra/llmessage/lliosocket.cpp
index 7ec577c..686c037 100644
--- a/linden/indra/llmessage/lliosocket.cpp
+++ b/linden/indra/llmessage/lliosocket.cpp
@@ -41,6 +41,7 @@
41#include "llhost.h" 41#include "llhost.h"
42#include "llmemtype.h" 42#include "llmemtype.h"
43#include "llpumpio.h" 43#include "llpumpio.h"
44#include "llthread.h"
44 45
45// 46//
46// constants 47// constants
@@ -104,51 +105,31 @@ void ll_debug_socket(const char* msg, apr_socket_t* apr_sock)
104/// 105///
105 106
106// static 107// static
107LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) 108LLSocket::ptr_t LLSocket::create(EType type, U16 port)
108{ 109{
109 LLMemType m1(LLMemType::MTYPE_IO_TCP); 110 LLMemType m1(LLMemType::MTYPE_IO_TCP);
110 LLSocket::ptr_t rv;
111 apr_socket_t* socket = NULL;
112 apr_pool_t* new_pool = NULL;
113 apr_status_t status = APR_EGENERAL; 111 apr_status_t status = APR_EGENERAL;
114 112 LLSocket::ptr_t rv(new LLSocket);
115 // create a pool for the socket
116 status = apr_pool_create(&new_pool, pool);
117 if(ll_apr_warn_status(status))
118 {
119 if(new_pool) apr_pool_destroy(new_pool);
120 return rv;
121 }
122 113
123 if(STREAM_TCP == type) 114 if(STREAM_TCP == type)
124 { 115 {
125 status = apr_socket_create( 116 status = apr_socket_create(&rv->mSocket, APR_INET, SOCK_STREAM, APR_PROTO_TCP, rv->mPool());
126 &socket,
127 APR_INET,
128 SOCK_STREAM,
129 APR_PROTO_TCP,
130 new_pool);
131 } 117 }
132 else if(DATAGRAM_UDP == type) 118 else if(DATAGRAM_UDP == type)
133 { 119 {
134 status = apr_socket_create( 120 status = apr_socket_create(&rv->mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, rv->mPool());
135 &socket,
136 APR_INET,
137 SOCK_DGRAM,
138 APR_PROTO_UDP,
139 new_pool);
140 } 121 }
141 else 122 else
142 { 123 {
143 if(new_pool) apr_pool_destroy(new_pool); 124 rv.reset();
144 return rv; 125 return rv;
145 } 126 }
146 if(ll_apr_warn_status(status)) 127 if(ll_apr_warn_status(status))
147 { 128 {
148 if(new_pool) apr_pool_destroy(new_pool); 129 rv->mSocket = NULL;
130 rv.reset();
149 return rv; 131 return rv;
150 } 132 }
151 rv = ptr_t(new LLSocket(socket, new_pool));
152 if(port > 0) 133 if(port > 0)
153 { 134 {
154 apr_sockaddr_t* sa = NULL; 135 apr_sockaddr_t* sa = NULL;
@@ -158,7 +139,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
158 APR_UNSPEC, 139 APR_UNSPEC,
159 port, 140 port,
160 0, 141 0,
161 new_pool); 142 rv->mPool());
162 if(ll_apr_warn_status(status)) 143 if(ll_apr_warn_status(status))
163 { 144 {
164 rv.reset(); 145 rv.reset();
@@ -166,8 +147,8 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
166 } 147 }
167 // This allows us to reuse the address on quick down/up. This 148 // This allows us to reuse the address on quick down/up. This
168 // is unlikely to create problems. 149 // is unlikely to create problems.
169 ll_apr_warn_status(apr_socket_opt_set(socket, APR_SO_REUSEADDR, 1)); 150 ll_apr_warn_status(apr_socket_opt_set(rv->mSocket, APR_SO_REUSEADDR, 1));
170 status = apr_socket_bind(socket, sa); 151 status = apr_socket_bind(rv->mSocket, sa);
171 if(ll_apr_warn_status(status)) 152 if(ll_apr_warn_status(status))
172 { 153 {
173 rv.reset(); 154 rv.reset();
@@ -181,7 +162,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
181 // to keep a queue of incoming connections for ACCEPT. 162 // to keep a queue of incoming connections for ACCEPT.
182 lldebugs << "Setting listen state for socket." << llendl; 163 lldebugs << "Setting listen state for socket." << llendl;
183 status = apr_socket_listen( 164 status = apr_socket_listen(
184 socket, 165 rv->mSocket,
185 LL_DEFAULT_LISTEN_BACKLOG); 166 LL_DEFAULT_LISTEN_BACKLOG);
186 if(ll_apr_warn_status(status)) 167 if(ll_apr_warn_status(status))
187 { 168 {
@@ -202,21 +183,28 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
202} 183}
203 184
204// static 185// static
205LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool) 186LLSocket::ptr_t LLSocket::create(apr_status_t& status, LLSocket::ptr_t& listen_socket)
206{ 187{
207 LLMemType m1(LLMemType::MTYPE_IO_TCP); 188 LLMemType m1(LLMemType::MTYPE_IO_TCP);
208 LLSocket::ptr_t rv; 189 if (!listen_socket->getSocket())
209 if(!socket) 190 {
191 status = APR_ENOSOCKET;
192 return LLSocket::ptr_t();
193 }
194 LLSocket::ptr_t rv(new LLSocket);
195 lldebugs << "accepting socket" << llendl;
196 status = apr_socket_accept(&rv->mSocket, listen_socket->getSocket(), rv->mPool());
197 if (status != APR_SUCCESS)
210 { 198 {
199 rv->mSocket = NULL;
200 rv.reset();
211 return rv; 201 return rv;
212 } 202 }
213 rv = ptr_t(new LLSocket(socket, pool));
214 rv->mPort = PORT_EPHEMERAL; 203 rv->mPort = PORT_EPHEMERAL;
215 rv->setOptions(); 204 rv->setOptions();
216 return rv; 205 return rv;
217} 206}
218 207
219
220bool LLSocket::blockingConnect(const LLHost& host) 208bool LLSocket::blockingConnect(const LLHost& host)
221{ 209{
222 if(!mSocket) return false; 210 if(!mSocket) return false;
@@ -229,7 +217,7 @@ bool LLSocket::blockingConnect(const LLHost& host)
229 APR_UNSPEC, 217 APR_UNSPEC,
230 host.getPort(), 218 host.getPort(),
231 0, 219 0,
232 mPool))) 220 mPool())))
233 { 221 {
234 return false; 222 return false;
235 } 223 }
@@ -240,13 +228,11 @@ bool LLSocket::blockingConnect(const LLHost& host)
240 return true; 228 return true;
241} 229}
242 230
243LLSocket::LLSocket(apr_socket_t* socket, apr_pool_t* pool) : 231LLSocket::LLSocket() :
244 mSocket(socket), 232 mSocket(NULL),
245 mPool(pool), 233 mPool(LLThread::tldata().mRootPool),
246 mPort(PORT_INVALID) 234 mPort(PORT_INVALID)
247{ 235{
248 ll_debug_socket("Constructing wholely formed socket", mSocket);
249 LLMemType m1(LLMemType::MTYPE_IO_TCP);
250} 236}
251 237
252LLSocket::~LLSocket() 238LLSocket::~LLSocket()
@@ -258,10 +244,6 @@ LLSocket::~LLSocket()
258 ll_debug_socket("Destroying socket", mSocket); 244 ll_debug_socket("Destroying socket", mSocket);
259 apr_socket_close(mSocket); 245 apr_socket_close(mSocket);
260 } 246 }
261 if(mPool)
262 {
263 apr_pool_destroy(mPool);
264 }
265} 247}
266 248
267void LLSocket::setOptions() 249void LLSocket::setOptions()
@@ -522,10 +504,8 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
522/// 504///
523 505
524LLIOServerSocket::LLIOServerSocket( 506LLIOServerSocket::LLIOServerSocket(
525 apr_pool_t* pool,
526 LLIOServerSocket::socket_t listener, 507 LLIOServerSocket::socket_t listener,
527 factory_t factory) : 508 factory_t factory) :
528 mPool(pool),
529 mListenSocket(listener), 509 mListenSocket(listener),
530 mReactor(factory), 510 mReactor(factory),
531 mInitialized(false), 511 mInitialized(false),
@@ -585,21 +565,15 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
585 lldebugs << "accepting socket" << llendl; 565 lldebugs << "accepting socket" << llendl;
586 566
587 PUMP_DEBUG; 567 PUMP_DEBUG;
588 apr_pool_t* new_pool = NULL; 568 apr_status_t status;
589 apr_status_t status = apr_pool_create(&new_pool, mPool); 569 LLSocket::ptr_t llsocket(LLSocket::create(status, mListenSocket));
590 apr_socket_t* socket = NULL;
591 status = apr_socket_accept(
592 &socket,
593 mListenSocket->getSocket(),
594 new_pool);
595 LLSocket::ptr_t llsocket(LLSocket::create(socket, new_pool));
596 //EStatus rv = STATUS_ERROR; 570 //EStatus rv = STATUS_ERROR;
597 if(llsocket) 571 if(llsocket && status == APR_SUCCESS)
598 { 572 {
599 PUMP_DEBUG; 573 PUMP_DEBUG;
600 574
601 apr_sockaddr_t* remote_addr; 575 apr_sockaddr_t* remote_addr;
602 apr_socket_addr_get(&remote_addr, APR_REMOTE, socket); 576 apr_socket_addr_get(&remote_addr, APR_REMOTE, llsocket->getSocket());
603 577
604 char* remote_host_string; 578 char* remote_host_string;
605 apr_sockaddr_ip_get(&remote_host_string, remote_addr); 579 apr_sockaddr_ip_get(&remote_host_string, remote_addr);
@@ -614,7 +588,6 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
614 { 588 {
615 chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(llsocket))); 589 chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(llsocket)));
616 pump->addChain(chain, mResponseTimeout); 590 pump->addChain(chain, mResponseTimeout);
617 status = STATUS_OK;
618 } 591 }
619 else 592 else
620 { 593 {
@@ -623,7 +596,8 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
623 } 596 }
624 else 597 else
625 { 598 {
626 llwarns << "Unable to create linden socket." << llendl; 599 char buf[256];
600 llwarns << "Unable to accept linden socket: " << apr_strerror(status, buf, sizeof(buf)) << llendl;
627 } 601 }
628 602
629 PUMP_DEBUG; 603 PUMP_DEBUG;
@@ -636,11 +610,10 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
636#if 0 610#if 0
637LLIODataSocket::LLIODataSocket( 611LLIODataSocket::LLIODataSocket(
638 U16 suggested_port, 612 U16 suggested_port,
639 U16 start_discovery_port, 613 U16 start_discovery_port) :
640 apr_pool_t* pool) :
641 mSocket(NULL) 614 mSocket(NULL)
642{ 615{
643 if(!pool || (PORT_INVALID == suggested_port)) return; 616 if(PORT_INVALID == suggested_port) return;
644 if(ll_apr_warn_status(apr_socket_create(&mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, pool))) return; 617 if(ll_apr_warn_status(apr_socket_create(&mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, pool))) return;
645 apr_sockaddr_t* sa = NULL; 618 apr_sockaddr_t* sa = NULL;
646 if(ll_apr_warn_status(apr_sockaddr_info_get(&sa, APR_ANYADDR, APR_UNSPEC, suggested_port, 0, pool))) return; 619 if(ll_apr_warn_status(apr_sockaddr_info_get(&sa, APR_ANYADDR, APR_UNSPEC, suggested_port, 0, pool))) return;
diff --git a/linden/indra/llmessage/lliosocket.h b/linden/indra/llmessage/lliosocket.h
index ec09ad8..5ad75e9 100644
--- a/linden/indra/llmessage/lliosocket.h
+++ b/linden/indra/llmessage/lliosocket.h
@@ -44,7 +44,6 @@
44 */ 44 */
45 45
46#include "lliopipe.h" 46#include "lliopipe.h"
47#include "apr_pools.h"
48#include "apr_network_io.h" 47#include "apr_network_io.h"
49#include "llchainio.h" 48#include "llchainio.h"
50 49
@@ -94,34 +93,22 @@ public:
94 * socket. If you intend the socket to be known to external 93 * socket. If you intend the socket to be known to external
95 * clients without prior port notification, do not use 94 * clients without prior port notification, do not use
96 * PORT_EPHEMERAL. 95 * PORT_EPHEMERAL.
97 * @param pool The apr pool to use. A child pool will be created
98 * and associated with the socket.
99 * @param type The type of socket to create 96 * @param type The type of socket to create
100 * @param port The port for the socket 97 * @param port The port for the socket
101 * @return A valid socket shared pointer if the call worked. 98 * @return A valid socket shared pointer if the call worked.
102 */ 99 */
103 static ptr_t create( 100 static ptr_t create(
104 apr_pool_t* pool,
105 EType type, 101 EType type,
106 U16 port = PORT_EPHEMERAL); 102 U16 port = PORT_EPHEMERAL);
107 103
108 /** 104 /**
109 * @brief Create a LLSocket when you already have an apr socket. 105 * @brief Create a LLSocket by accepting a connection from a listen socket.
110 * 106 *
111 * This method assumes an ephemeral port. This is typically used 107 * @param status Output. Status of the accept if a valid listen socket was passed.
112 * by calls which spawn a socket such as a call to 108 * @param listen_socket The listen socket to use.
113 * <code>accept()</code> as in the server socket. This call should
114 * not fail if you have a valid apr socket.
115 * Because of the nature of how accept() works, you are expected
116 * to create a new pool for the socket, use that pool for the
117 * accept, and pass it in here where it will be bound with the
118 * socket and destroyed at the same time.
119 * @param socket The apr socket to use
120 * @param pool The pool used to create the socket. *NOTE: The pool
121 * passed in will be DESTROYED.
122 * @return A valid socket shared pointer if the call worked. 109 * @return A valid socket shared pointer if the call worked.
123 */ 110 */
124 static ptr_t create(apr_socket_t* socket, apr_pool_t* pool); 111 static ptr_t create(apr_status_t& status, ptr_t& listen_socket);
125 112
126 /** 113 /**
127 * @brief Perform a blocking connect to a host. Do not use in production. 114 * @brief Perform a blocking connect to a host. Do not use in production.
@@ -156,7 +143,7 @@ protected:
156 * @brief Protected constructor since should only make sockets 143 * @brief Protected constructor since should only make sockets
157 * with one of the two <code>create()</code> calls. 144 * with one of the two <code>create()</code> calls.
158 */ 145 */
159 LLSocket(apr_socket_t* socket, apr_pool_t* pool); 146 LLSocket(void);
160 147
161 /** 148 /**
162 * @brief Set default socket options. 149 * @brief Set default socket options.
@@ -173,8 +160,8 @@ protected:
173 // The apr socket. 160 // The apr socket.
174 apr_socket_t* mSocket; 161 apr_socket_t* mSocket;
175 162
176 // our memory pool 163 // Our memory pool.
177 apr_pool_t* mPool; 164 AIAPRPool mPool;
178 165
179 // The port if we know it. 166 // The port if we know it.
180 U16 mPort; 167 U16 mPort;
@@ -299,7 +286,7 @@ class LLIOServerSocket : public LLIOPipe
299public: 286public:
300 typedef LLSocket::ptr_t socket_t; 287 typedef LLSocket::ptr_t socket_t;
301 typedef boost::shared_ptr<LLChainIOFactory> factory_t; 288 typedef boost::shared_ptr<LLChainIOFactory> factory_t;
302 LLIOServerSocket(apr_pool_t* pool, socket_t listener, factory_t reactor); 289 LLIOServerSocket(socket_t listener, factory_t reactor);
303 virtual ~LLIOServerSocket(); 290 virtual ~LLIOServerSocket();
304 291
305 /** 292 /**
@@ -331,7 +318,6 @@ protected:
331 //@} 318 //@}
332 319
333protected: 320protected:
334 apr_pool_t* mPool;
335 socket_t mListenSocket; 321 socket_t mListenSocket;
336 factory_t mReactor; 322 factory_t mReactor;
337 bool mInitialized; 323 bool mInitialized;
@@ -365,8 +351,7 @@ public:
365 */ 351 */
366 LLIODataSocket( 352 LLIODataSocket(
367 U16 suggested_port, 353 U16 suggested_port,
368 U16 start_discovery_port, 354 U16 start_discovery_port);
369 apr_pool_t* pool);
370 virtual ~LLIODataSocket(); 355 virtual ~LLIODataSocket();
371 356
372protected: 357protected:
diff --git a/linden/indra/llmessage/llmail.cpp b/linden/indra/llmessage/llmail.cpp
index d52ff6c..8850e29 100644
--- a/linden/indra/llmessage/llmail.cpp
+++ b/linden/indra/llmessage/llmail.cpp
@@ -56,6 +56,7 @@
56#include "llstring.h" 56#include "llstring.h"
57#include "lluuid.h" 57#include "lluuid.h"
58#include "net.h" 58#include "net.h"
59#include "aiaprpool.h"
59 60
60// 61//
61// constants 62// constants
@@ -63,7 +64,7 @@
63const size_t LL_MAX_KNOWN_GOOD_MAIL_SIZE = 4096; 64const size_t LL_MAX_KNOWN_GOOD_MAIL_SIZE = 4096;
64 65
65static bool gMailEnabled = true; 66static bool gMailEnabled = true;
66static apr_pool_t* gMailPool; 67static AIAPRPool gMailPool;
67static apr_sockaddr_t* gSockAddr; 68static apr_sockaddr_t* gSockAddr;
68static apr_socket_t* gMailSocket; 69static apr_socket_t* gMailSocket;
69 70
@@ -88,7 +89,7 @@ bool connect_smtp()
88 gSockAddr->sa.sin.sin_family, 89 gSockAddr->sa.sin.sin_family,
89 SOCK_STREAM, 90 SOCK_STREAM,
90 APR_PROTO_TCP, 91 APR_PROTO_TCP,
91 gMailPool); 92 gMailPool());
92 if(ll_apr_warn_status(status)) return false; 93 if(ll_apr_warn_status(status)) return false;
93 status = apr_socket_connect(gMailSocket, gSockAddr); 94 status = apr_socket_connect(gMailSocket, gSockAddr);
94 if(ll_apr_warn_status(status)) 95 if(ll_apr_warn_status(status))
@@ -145,19 +146,19 @@ BOOL LLMail::send(
145} 146}
146 147
147// static 148// static
148void LLMail::init(const std::string& hostname, apr_pool_t* pool) 149void LLMail::init(const std::string& hostname)
149{ 150{
150 gMailSocket = NULL; 151 gMailSocket = NULL;
151 if(hostname.empty() || !pool) 152 if (hostname.empty())
152 { 153 {
153 gMailPool = NULL;
154 gSockAddr = NULL; 154 gSockAddr = NULL;
155 gMailPool.destroy();
155 } 156 }
156 else 157 else
157 { 158 {
158 gMailPool = pool; 159 gMailPool.create();
159 160
160 // collect all the information into a socaddr sturcture. the 161 // Collect all the information into a sockaddr structure. the
161 // documentation is a bit unclear, but I either have to 162 // documentation is a bit unclear, but I either have to
162 // specify APR_UNSPEC or not specify any flags. I am not sure 163 // specify APR_UNSPEC or not specify any flags. I am not sure
163 // which option is better. 164 // which option is better.
@@ -167,7 +168,7 @@ void LLMail::init(const std::string& hostname, apr_pool_t* pool)
167 APR_UNSPEC, 168 APR_UNSPEC,
168 25, 169 25,
169 APR_IPV4_ADDR_OK, 170 APR_IPV4_ADDR_OK,
170 gMailPool); 171 gMailPool());
171 ll_apr_warn_status(status); 172 ll_apr_warn_status(status);
172 } 173 }
173} 174}
diff --git a/linden/indra/llmessage/llmail.h b/linden/indra/llmessage/llmail.h
index 7effb84..7026d93 100644
--- a/linden/indra/llmessage/llmail.h
+++ b/linden/indra/llmessage/llmail.h
@@ -33,15 +33,13 @@
33#ifndef LL_LLMAIL_H 33#ifndef LL_LLMAIL_H
34#define LL_LLMAIL_H 34#define LL_LLMAIL_H
35 35
36typedef struct apr_pool_t apr_pool_t;
37
38#include "llsd.h" 36#include "llsd.h"
39 37
40class LLMail 38class LLMail
41{ 39{
42public: 40public:
43 // if hostname is NULL, then the host is resolved as 'mail' 41 // if hostname is NULL, then the host is resolved as 'mail'
44 static void init(const std::string& hostname, apr_pool_t* pool); 42 static void init(const std::string& hostname);
45 43
46 // Allow all email transmission to be disabled/enabled. 44 // Allow all email transmission to be disabled/enabled.
47 static void enable(bool mail_enabled); 45 static void enable(bool mail_enabled);
diff --git a/linden/indra/llmessage/llpartdata.cpp b/linden/indra/llmessage/llpartdata.cpp
index 485bc6a..a2811ab 100644
--- a/linden/indra/llmessage/llpartdata.cpp
+++ b/linden/indra/llmessage/llpartdata.cpp
@@ -347,3 +347,93 @@ void LLPartSysData::setPartAccel(const LLVector3 &accel)
347 mPartAccel.mV[VY] = llclamp(accel.mV[VY], -100.f, 100.f); 347 mPartAccel.mV[VY] = llclamp(accel.mV[VY], -100.f, 100.f);
348 mPartAccel.mV[VZ] = llclamp(accel.mV[VZ], -100.f, 100.f); 348 mPartAccel.mV[VZ] = llclamp(accel.mV[VZ], -100.f, 100.f);
349} 349}
350
351LLSD LLPartSysData::asLLSD() const
352{
353 LLSD sd = LLSD();
354
355 sd["LL_PART_INTERP_COLOR_MASK"] = (LLPartData::LL_PART_INTERP_COLOR_MASK & mPartData.mFlags) ? 1 : 0;
356 sd["LL_PART_INTERP_SCALE_MASK"] = (LLPartData::LL_PART_INTERP_SCALE_MASK & mPartData.mFlags) ? 1 : 0;
357 sd["LL_PART_BOUNCE_MASK"] = (LLPartData::LL_PART_BOUNCE_MASK & mPartData.mFlags) ? 1 : 0;
358 sd["LL_PART_WIND_MASK"] = (LLPartData::LL_PART_WIND_MASK & mPartData.mFlags) ? 1 : 0;
359 sd["LL_PART_FOLLOW_SRC_MASK"] = (LLPartData::LL_PART_FOLLOW_SRC_MASK & mPartData.mFlags) ? 1 : 0;
360 sd["LL_PART_FOLLOW_VELOCITY_MASK"] = (LLPartData::LL_PART_FOLLOW_VELOCITY_MASK & mPartData.mFlags) ? 1 : 0;
361 sd["LL_PART_TARGET_POS_MASK"] = (LLPartData::LL_PART_TARGET_POS_MASK & mPartData.mFlags) ? 1 : 0;
362 sd["LL_PART_TARGET_LINEAR_MASK"] = (LLPartData::LL_PART_TARGET_LINEAR_MASK & mPartData.mFlags) ? 1 : 0;
363 sd["LL_PART_EMISSIVE_MASK"] = (LLPartData::LL_PART_EMISSIVE_MASK & mPartData.mFlags) ? 1 : 0;
364 sd["LL_PART_BEAM_MASK"] = (LLPartData::LL_PART_BEAM_MASK & mPartData.mFlags) ? 1 : 0;
365
366 sd["SourceMaxage"] = mPartData.mMaxAge;
367 sd["Startcolor"] = ll_sd_from_color4(mPartData.mStartColor);
368 sd["Endcolor"] = ll_sd_from_color4(mPartData.mEndColor);
369 sd["Startscale"] = ll_sd_from_vector2(mPartData.mStartScale);
370 sd["Endscale"] = ll_sd_from_vector2(mPartData.mEndScale);
371
372 sd["ParticleMaxAge"] = mMaxAge;
373 sd["ParticleStartAge"] = mStartAge;
374
375
376 sd["LL_PART_SRC_PATTERN_DROP"] = ( mPattern & LL_PART_SRC_PATTERN_DROP) ? 1 : 0;
377 sd["LL_PART_SRC_PATTERN_EXPLODE"] = ( mPattern & LL_PART_SRC_PATTERN_EXPLODE) ? 1 : 0;
378 sd["LL_PART_SRC_PATTERN_ANGLE"] = ( mPattern & LL_PART_SRC_PATTERN_ANGLE) ? 1 : 0;
379 sd["LL_PART_SRC_PATTERN_ANGLE_CONE"] = ( mPattern & LL_PART_SRC_PATTERN_ANGLE_CONE) ? 1 : 0 ;
380 sd["LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY"] = ( mPattern & LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY) ? 1 : 0;
381
382 sd["InnerAngle"] = mInnerAngle;
383 sd["OuterAngle"] = mOuterAngle;
384 sd["AngularVelocity"] = ll_sd_from_vector3(mAngularVelocity);
385 sd["BurstRate"] = mBurstRate;
386 sd["BurstPartCount"] = mBurstPartCount;
387 sd["BurstSpeedMin"] = mBurstSpeedMin;
388 sd["BurstSpeedMax"] = mBurstSpeedMax;
389 sd["BurstRadius"] = mBurstRadius;
390 sd["PartImageID"] = mPartImageID.asString();
391 sd["TargetId"] = mTargetUUID.asString();
392 return sd;
393}
394
395bool LLPartSysData::fromLLSD(LLSD& sd)
396{
397 mPartData.mFlags = 0;
398 if (sd["LL_PART_INTERP_COLOR_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_INTERP_COLOR_MASK;
399 if (sd["LL_PART_INTERP_SCALE_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_INTERP_SCALE_MASK;
400 if (sd["LL_PART_BOUNCE_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_BOUNCE_MASK;
401 if (sd["LL_PART_WIND_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_WIND_MASK;
402 if (sd["LL_PART_FOLLOW_SRC_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_FOLLOW_SRC_MASK;
403 if (sd["LL_PART_FOLLOW_VELOCITY_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_FOLLOW_VELOCITY_MASK;
404 if (sd["LL_PART_TARGET_POS_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_TARGET_POS_MASK;
405 if (sd["LL_PART_TARGET_LINEAR_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_TARGET_LINEAR_MASK;
406 if (sd["LL_PART_EMISSIVE_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_EMISSIVE_MASK;
407 if (sd["LL_PART_BEAM_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_BEAM_MASK;
408
409 mPartData.mMaxAge = (F32)sd["SourceMaxage"].asReal();
410 mPartData.mStartColor = ll_color4_from_sd(sd["Startcolor"]);
411 mPartData.mEndColor = ll_color4_from_sd(sd["Endcolor"]);
412 mPartData.mStartScale = ll_vector2_from_sd(sd["Startscale"]);
413 mPartData.mEndScale = ll_vector2_from_sd(sd["Endscale"]);
414
415 mMaxAge = (F32)sd["ParticleMaxAge"].asReal();
416 mStartAge = (F32)sd["ParticleStartAge"].asReal();
417
418 mPattern = 0;
419 if (sd["LL_PART_SRC_PATTERN_DROP"]) mPattern |= LL_PART_SRC_PATTERN_DROP;
420 if (sd["LL_PART_SRC_PATTERN_EXPLODE"]) mPattern |= LL_PART_SRC_PATTERN_EXPLODE;
421 if (sd["LL_PART_SRC_PATTERN_ANGLE"]) mPattern |= LL_PART_SRC_PATTERN_ANGLE;
422 if (sd["LL_PART_SRC_PATTERN_ANGLE_CONE"]) mPattern |= LL_PART_SRC_PATTERN_ANGLE_CONE;
423 if (sd["LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY"]) mPattern |= LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY;
424
425 mInnerAngle = (F32)sd["InnerAngle"].asReal();
426 mOuterAngle = (F32)sd["OuterAngle"].asReal();
427 mAngularVelocity = ll_vector3_from_sd(sd["AngularVelocity"]);
428 mBurstRate = (F32)sd["BurstRate"].asReal();
429 int burst_part_count = sd["BurstPartCount"];
430 mBurstPartCount = (U8)burst_part_count;
431 mBurstSpeedMin = (F32)sd["BurstSpeedMin"].asReal();
432 mBurstSpeedMax = (F32)sd["BurstSpeedMax"].asReal();
433 mBurstRadius = (F32)sd["BurstRadius"].asReal();
434
435 mPartImageID = LLUUID(sd[("PartImageID")].asString());
436 mTargetUUID = LLUUID(sd["TargetId"].asString());
437
438 return true;
439} \ No newline at end of file
diff --git a/linden/indra/llmessage/llpartdata.h b/linden/indra/llmessage/llpartdata.h
index 6dcb311..b7efa95 100644
--- a/linden/indra/llmessage/llpartdata.h
+++ b/linden/indra/llmessage/llpartdata.h
@@ -158,6 +158,9 @@ public:
158 BOOL unpackBlock(const S32 block_num); 158 BOOL unpackBlock(const S32 block_num);
159 BOOL packBlock(); 159 BOOL packBlock();
160 160
161 LLSD asLLSD() const;
162 bool fromLLSD(LLSD& sd);
163
161 static BOOL packNull(); 164 static BOOL packNull();
162 static BOOL isNullPS(const S32 block_num); // Returns FALSE if this is a "NULL" particle system (i.e. no system) 165 static BOOL isNullPS(const S32 block_num); // Returns FALSE if this is a "NULL" particle system (i.e. no system)
163 166
diff --git a/linden/indra/llmessage/llpumpio.cpp b/linden/indra/llmessage/llpumpio.cpp
index 8ef2b16..6f10c6b 100644
--- a/linden/indra/llmessage/llpumpio.cpp
+++ b/linden/indra/llmessage/llpumpio.cpp
@@ -43,6 +43,7 @@
43#include "llmemtype.h" 43#include "llmemtype.h"
44#include "llstl.h" 44#include "llstl.h"
45#include "llstat.h" 45#include "llstat.h"
46#include "llthread.h"
46#include "llfasttimer.h" 47#include "llfasttimer.h"
47 48
48// These should not be enabled in production, but they can be 49// These should not be enabled in production, but they can be
@@ -169,14 +170,12 @@ struct ll_delete_apr_pollset_fd_client_data
169/** 170/**
170 * LLPumpIO 171 * LLPumpIO
171 */ 172 */
172LLPumpIO::LLPumpIO(apr_pool_t* pool) : 173LLPumpIO::LLPumpIO(void) :
173 mState(LLPumpIO::NORMAL), 174 mState(LLPumpIO::NORMAL),
174 mRebuildPollset(false), 175 mRebuildPollset(false),
175 mPollset(NULL), 176 mPollset(NULL),
176 mPollsetClientID(0), 177 mPollsetClientID(0),
177 mNextLock(0), 178 mNextLock(0),
178 mPool(NULL),
179 mCurrentPool(NULL),
180 mCurrentPoolReallocCount(0), 179 mCurrentPoolReallocCount(0),
181 mChainsMutex(NULL), 180 mChainsMutex(NULL),
182 mCallbackMutex(NULL), 181 mCallbackMutex(NULL),
@@ -185,21 +184,24 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
185 mCurrentChain = mRunningChains.end(); 184 mCurrentChain = mRunningChains.end();
186 185
187 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 186 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
188 initialize(pool); 187 initialize();
189} 188}
190 189
191LLPumpIO::~LLPumpIO() 190LLPumpIO::~LLPumpIO()
192{ 191{
193 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 192 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
194 cleanup(); 193#if LL_THREADS_APR
195} 194 if (mChainsMutex) apr_thread_mutex_destroy(mChainsMutex);
196 195 if (mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex);
197bool LLPumpIO::prime(apr_pool_t* pool) 196#endif
198{ 197 mChainsMutex = NULL;
199 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 198 mCallbackMutex = NULL;
200 cleanup(); 199 if(mPollset)
201 initialize(pool); 200 {
202 return ((pool == NULL) ? false : true); 201// lldebugs << "cleaning up pollset" << llendl;
202 apr_pollset_destroy(mPollset);
203 mPollset = NULL;
204 }
203} 205}
204 206
205bool LLPumpIO::addChain(const chain_t& chain, F32 timeout) 207bool LLPumpIO::addChain(const chain_t& chain, F32 timeout)
@@ -359,8 +361,7 @@ bool LLPumpIO::setConditional(LLIOPipe* pipe, const apr_pollfd_t* poll)
359 { 361 {
360 // each fd needs a pool to work with, so if one was 362 // each fd needs a pool to work with, so if one was
361 // not specified, use this pool. 363 // not specified, use this pool.
362 // *FIX: Should it always be this pool? 364 value.second.p = (*mCurrentChain).mDescriptorsPool->operator()();
363 value.second.p = mPool;
364 } 365 }
365 value.second.client_data = new S32(++mPollsetClientID); 366 value.second.client_data = new S32(++mPollsetClientID);
366 (*mCurrentChain).mDescriptors.push_back(value); 367 (*mCurrentChain).mDescriptors.push_back(value);
@@ -827,39 +828,15 @@ void LLPumpIO::control(LLPumpIO::EControl op)
827 } 828 }
828} 829}
829 830
830void LLPumpIO::initialize(apr_pool_t* pool) 831void LLPumpIO::initialize(void)
831{ 832{
832 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 833 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
833 if(!pool) return; 834 mPool.create();
834#if LL_THREADS_APR 835#if LL_THREADS_APR
835 // SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly. 836 // SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly.
836 apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, pool); 837 apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, mPool());
837 apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, pool); 838 apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, mPool());
838#endif
839 mPool = pool;
840}
841
842void LLPumpIO::cleanup()
843{
844 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
845#if LL_THREADS_APR
846 if(mChainsMutex) apr_thread_mutex_destroy(mChainsMutex);
847 if(mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex);
848#endif 839#endif
849 mChainsMutex = NULL;
850 mCallbackMutex = NULL;
851 if(mPollset)
852 {
853// lldebugs << "cleaning up pollset" << llendl;
854 apr_pollset_destroy(mPollset);
855 mPollset = NULL;
856 }
857 if(mCurrentPool)
858 {
859 apr_pool_destroy(mCurrentPool);
860 mCurrentPool = NULL;
861 }
862 mPool = NULL;
863} 840}
864 841
865void LLPumpIO::rebuildPollset() 842void LLPumpIO::rebuildPollset()
@@ -887,21 +864,19 @@ void LLPumpIO::rebuildPollset()
887 if(mCurrentPool 864 if(mCurrentPool
888 && (0 == (++mCurrentPoolReallocCount % POLLSET_POOL_RECYCLE_COUNT))) 865 && (0 == (++mCurrentPoolReallocCount % POLLSET_POOL_RECYCLE_COUNT)))
889 { 866 {
890 apr_pool_destroy(mCurrentPool); 867 mCurrentPool.destroy();
891 mCurrentPool = NULL;
892 mCurrentPoolReallocCount = 0; 868 mCurrentPoolReallocCount = 0;
893 } 869 }
894 if(!mCurrentPool) 870 if(!mCurrentPool)
895 { 871 {
896 apr_status_t status = apr_pool_create(&mCurrentPool, mPool); 872 mCurrentPool.create(mPool);
897 (void)ll_apr_warn_status(status);
898 } 873 }
899 874
900 // add all of the file descriptors 875 // add all of the file descriptors
901 run_it = mRunningChains.begin(); 876 run_it = mRunningChains.begin();
902 LLChainInfo::conditionals_t::iterator fd_it; 877 LLChainInfo::conditionals_t::iterator fd_it;
903 LLChainInfo::conditionals_t::iterator fd_end; 878 LLChainInfo::conditionals_t::iterator fd_end;
904 apr_pollset_create(&mPollset, size, mCurrentPool, 0); 879 apr_pollset_create(&mPollset, size, mCurrentPool(), 0);
905 for(; run_it != run_end; ++run_it) 880 for(; run_it != run_end; ++run_it)
906 { 881 {
907 fd_it = (*run_it).mDescriptors.begin(); 882 fd_it = (*run_it).mDescriptors.begin();
@@ -1159,7 +1134,8 @@ bool LLPumpIO::handleChainError(
1159LLPumpIO::LLChainInfo::LLChainInfo() : 1134LLPumpIO::LLChainInfo::LLChainInfo() :
1160 mInit(false), 1135 mInit(false),
1161 mLock(0), 1136 mLock(0),
1162 mEOS(false) 1137 mEOS(false),
1138 mDescriptorsPool(new AIAPRPool(LLThread::tldata().mRootPool))
1163{ 1139{
1164 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 1140 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
1165 mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS); 1141 mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS);
diff --git a/linden/indra/llmessage/llpumpio.h b/linden/indra/llmessage/llpumpio.h
index fc0bfab..2666be0 100644
--- a/linden/indra/llmessage/llpumpio.h
+++ b/linden/indra/llmessage/llpumpio.h
@@ -36,11 +36,12 @@
36#define LL_LLPUMPIO_H 36#define LL_LLPUMPIO_H
37 37
38#include <set> 38#include <set>
39#include <boost/shared_ptr.hpp>
39#if LL_LINUX // needed for PATH_MAX in APR. 40#if LL_LINUX // needed for PATH_MAX in APR.
40#include <sys/param.h> 41#include <sys/param.h>
41#endif 42#endif
42 43
43#include "apr_pools.h" 44#include "aiaprpool.h"
44#include "llbuffer.h" 45#include "llbuffer.h"
45#include "llframetimer.h" 46#include "llframetimer.h"
46#include "lliopipe.h" 47#include "lliopipe.h"
@@ -64,9 +65,8 @@ extern const F32 NEVER_CHAIN_EXPIRY_SECS;
64 * <code>pump()</code> on a thread used for IO and call 65 * <code>pump()</code> on a thread used for IO and call
65 * <code>respond()</code> on a thread that is expected to do higher 66 * <code>respond()</code> on a thread that is expected to do higher
66 * level processing. You can call almost any other method from any 67 * level processing. You can call almost any other method from any
67 * thread - see notes for each method for details. In order for the 68 * thread - see notes for each method for details.
68 * threading abstraction to work, you need to call <code>prime()</code> 69 *
69 * with a valid apr pool.
70 * A pump instance manages much of the state for the pipe, including 70 * A pump instance manages much of the state for the pipe, including
71 * the list of pipes in the chain, the channel for each element in the 71 * the list of pipes in the chain, the channel for each element in the
72 * chain, the buffer, and if any pipe has marked the stream or process 72 * chain, the buffer, and if any pipe has marked the stream or process
@@ -85,7 +85,7 @@ public:
85 /** 85 /**
86 * @brief Constructor. 86 * @brief Constructor.
87 */ 87 */
88 LLPumpIO(apr_pool_t* pool); 88 LLPumpIO(void);
89 89
90 /** 90 /**
91 * @brief Destructor. 91 * @brief Destructor.
@@ -93,17 +93,6 @@ public:
93 ~LLPumpIO(); 93 ~LLPumpIO();
94 94
95 /** 95 /**
96 * @brief Prepare this pump for usage.
97 *
98 * If you fail to call this method prior to use, the pump will
99 * try to work, but will not come with any thread locking
100 * mechanisms.
101 * @param pool The apr pool to use.
102 * @return Returns true if the pump is primed.
103 */
104 bool prime(apr_pool_t* pool);
105
106 /**
107 * @brief Typedef for having a chain of pipes. 96 * @brief Typedef for having a chain of pipes.
108 */ 97 */
109 typedef std::vector<LLIOPipe::ptr_t> chain_t; 98 typedef std::vector<LLIOPipe::ptr_t> chain_t;
@@ -374,6 +363,7 @@ protected:
374 typedef std::pair<LLIOPipe::ptr_t, apr_pollfd_t> pipe_conditional_t; 363 typedef std::pair<LLIOPipe::ptr_t, apr_pollfd_t> pipe_conditional_t;
375 typedef std::vector<pipe_conditional_t> conditionals_t; 364 typedef std::vector<pipe_conditional_t> conditionals_t;
376 conditionals_t mDescriptors; 365 conditionals_t mDescriptors;
366 boost::shared_ptr<AIAPRPool> mDescriptorsPool;
377 }; 367 };
378 368
379 // All the running chains & info 369 // All the running chains & info
@@ -392,9 +382,9 @@ protected:
392 callbacks_t mPendingCallbacks; 382 callbacks_t mPendingCallbacks;
393 callbacks_t mCallbacks; 383 callbacks_t mCallbacks;
394 384
395 // memory allocator for pollsets & mutexes. 385 // Memory pool for pollsets & mutexes.
396 apr_pool_t* mPool; 386 AIAPRPool mPool;
397 apr_pool_t* mCurrentPool; 387 AIAPRPool mCurrentPool;
398 S32 mCurrentPoolReallocCount; 388 S32 mCurrentPoolReallocCount;
399 389
400#if LL_THREADS_APR 390#if LL_THREADS_APR
@@ -406,8 +396,7 @@ protected:
406#endif 396#endif
407 397
408protected: 398protected:
409 void initialize(apr_pool_t* pool); 399 void initialize();
410 void cleanup();
411 400
412 /** 401 /**
413 * @brief Given the internal state of the chains, rebuild the pollset 402 * @brief Given the internal state of the chains, rebuild the pollset
diff --git a/linden/indra/llmessage/llregionflags.h b/linden/indra/llmessage/llregionflags.h
index 2324785..70c3499 100644
--- a/linden/indra/llmessage/llregionflags.h
+++ b/linden/indra/llmessage/llregionflags.h
@@ -137,15 +137,6 @@ inline U32 unset_prelude_flags(U32 flags)
137 & ~(REGION_FLAGS_PRELUDE_SET | REGION_FLAGS_SUN_FIXED)); 137 & ~(REGION_FLAGS_PRELUDE_SET | REGION_FLAGS_SUN_FIXED));
138} 138}
139 139
140// estate constants. Need to match first few etries in indra.estate table.
141const U32 ESTATE_ALL = 0; // will not match in db, reserved key for logic
142const U32 ESTATE_MAINLAND = 1;
143const U32 ESTATE_ORIENTATION = 2;
144const U32 ESTATE_INTERNAL = 3;
145const U32 ESTATE_SHOWCASE = 4;
146const U32 ESTATE_TEEN = 5;
147const U32 ESTATE_LAST_LINDEN = 5; // last linden owned/managed estate
148
149// for EstateOwnerRequest, setaccess message 140// for EstateOwnerRequest, setaccess message
150const U32 ESTATE_ACCESS_ALLOWED_AGENTS = 1 << 0; 141const U32 ESTATE_ACCESS_ALLOWED_AGENTS = 1 << 0;
151const U32 ESTATE_ACCESS_ALLOWED_GROUPS = 1 << 1; 142const U32 ESTATE_ACCESS_ALLOWED_GROUPS = 1 << 1;
diff --git a/linden/indra/llmessage/llurlrequest.cpp b/linden/indra/llmessage/llurlrequest.cpp
index 46e976f..87f0116 100644
--- a/linden/indra/llmessage/llurlrequest.cpp
+++ b/linden/indra/llmessage/llurlrequest.cpp
@@ -45,6 +45,7 @@
45#include "llstring.h" 45#include "llstring.h"
46#include "apr_env.h" 46#include "apr_env.h"
47#include "llapr.h" 47#include "llapr.h"
48#include "llscopedvolatileaprpool.h"
48static const U32 HTTP_STATUS_PIPE_ERROR = 499; 49static const U32 HTTP_STATUS_PIPE_ERROR = 499;
49 50
50/** 51/**
@@ -161,27 +162,31 @@ void LLURLRequest::setCallback(LLURLRequestComplete* callback)
161// is called with use_proxy = FALSE 162// is called with use_proxy = FALSE
162void LLURLRequest::useProxy(bool use_proxy) 163void LLURLRequest::useProxy(bool use_proxy)
163{ 164{
164 static char *env_proxy; 165 static std::string env_proxy;
165 166
166 if (use_proxy && (env_proxy == NULL)) 167 if (use_proxy && env_proxy.empty())
167 { 168 {
168 apr_status_t status; 169 char* env_proxy_str;
169 LLAPRPool pool; 170 LLScopedVolatileAPRPool scoped_pool;
170 status = apr_env_get(&env_proxy, "ALL_PROXY", pool.getAPRPool()); 171 apr_status_t status = apr_env_get(&env_proxy_str, "ALL_PROXY", scoped_pool);
171 if (status != APR_SUCCESS) 172 if (status != APR_SUCCESS)
172 { 173 {
173 status = apr_env_get(&env_proxy, "http_proxy", pool.getAPRPool()); 174 status = apr_env_get(&env_proxy_str, "http_proxy", scoped_pool);
174 } 175 }
175 if (status != APR_SUCCESS) 176 if (status != APR_SUCCESS)
176 { 177 {
177 use_proxy = FALSE; 178 use_proxy = false;
178 } 179 }
180 else
181 {
182 // env_proxy_str is stored in the scoped_pool, so we have to make a copy.
183 env_proxy = env_proxy_str;
184 }
179 } 185 }
180 186
187 lldebugs << "use_proxy = " << (use_proxy?'Y':'N') << ", env_proxy = \"" << env_proxy << "\"" << llendl;
181 188
182 lldebugs << "use_proxy = " << (use_proxy?'Y':'N') << ", env_proxy = " << (env_proxy ? env_proxy : "(null)") << llendl; 189 if (use_proxy)
183
184 if (env_proxy && use_proxy)
185 { 190 {
186 mDetail->mCurlRequest->setoptString(CURLOPT_PROXY, env_proxy); 191 mDetail->mCurlRequest->setoptString(CURLOPT_PROXY, env_proxy);
187 } 192 }
diff --git a/linden/indra/llmessage/message.cpp b/linden/indra/llmessage/message.cpp
index 7e8aff1..53036bc 100644
--- a/linden/indra/llmessage/message.cpp
+++ b/linden/indra/llmessage/message.cpp
@@ -103,8 +103,10 @@ std::string get_shared_secret();
103class LLMessagePollInfo 103class LLMessagePollInfo
104{ 104{
105public: 105public:
106 LLMessagePollInfo(void) : mPool(LLThread::tldata().mRootPool) { }
106 apr_socket_t *mAPRSocketp; 107 apr_socket_t *mAPRSocketp;
107 apr_pollfd_t mPollFD; 108 apr_pollfd_t mPollFD;
109 AIAPRPool mPool;
108}; 110};
109 111
110namespace 112namespace
@@ -291,20 +293,13 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port,
291 } 293 }
292// LL_DEBUGS("Messaging") << << "*** port: " << mPort << llendl; 294// LL_DEBUGS("Messaging") << << "*** port: " << mPort << llendl;
293 295
294 // 296 mPollInfop = new LLMessagePollInfo;
295 // Create the data structure that we can poll on 297
296 //
297 if (!gAPRPoolp)
298 {
299 LL_ERRS("Messaging") << "No APR pool before message system initialization!" << llendl;
300 ll_init_apr();
301 }
302 apr_socket_t *aprSocketp = NULL; 298 apr_socket_t *aprSocketp = NULL;
303 apr_os_sock_put(&aprSocketp, (apr_os_sock_t*)&mSocket, gAPRPoolp); 299 apr_os_sock_put(&aprSocketp, (apr_os_sock_t*)&mSocket, mPollInfop->mPool());
304 300
305 mPollInfop = new LLMessagePollInfo;
306 mPollInfop->mAPRSocketp = aprSocketp; 301 mPollInfop->mAPRSocketp = aprSocketp;
307 mPollInfop->mPollFD.p = gAPRPoolp; 302 mPollInfop->mPollFD.p = mPollInfop->mPool();
308 mPollInfop->mPollFD.desc_type = APR_POLL_SOCKET; 303 mPollInfop->mPollFD.desc_type = APR_POLL_SOCKET;
309 mPollInfop->mPollFD.reqevents = APR_POLLIN; 304 mPollInfop->mPollFD.reqevents = APR_POLLIN;
310 mPollInfop->mPollFD.rtnevents = 0; 305 mPollInfop->mPollFD.rtnevents = 0;
diff --git a/linden/indra/llplugin/llpluginclassmedia.cpp b/linden/indra/llplugin/llpluginclassmedia.cpp
index 85241be..5a81c46 100755
--- a/linden/indra/llplugin/llpluginclassmedia.cpp
+++ b/linden/indra/llplugin/llpluginclassmedia.cpp
@@ -72,10 +72,10 @@ LLPluginClassMedia::~LLPluginClassMedia()
72} 72}
73 73
74bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug) 74bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
75{ 75{
76 LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL; 76 LL_DEBUGS("PluginClassMedia") << "launcher: " << launcher_filename << LL_ENDL;
77 LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL; 77 LL_DEBUGS("PluginClassMedia") << "plugin: " << plugin_filename << LL_ENDL;
78 78
79 mPlugin = new LLPluginProcessParent(this); 79 mPlugin = new LLPluginProcessParent(this);
80 mPlugin->setSleepTime(mSleepTime); 80 mPlugin->setSleepTime(mSleepTime);
81 81
@@ -198,7 +198,7 @@ void LLPluginClassMedia::idle(void)
198 } 198 }
199 else 199 else
200 { 200 {
201 LL_WARNS("Plugin") << "Unable to pad texture width, padding size " << mPadding << "is not a multiple of pixel size " << mRequestedTextureDepth << LL_ENDL; 201 LL_WARNS("PluginClassMedia") << "Unable to pad texture width, padding size " << mPadding << "is not a multiple of pixel size " << mRequestedTextureDepth << LL_ENDL;
202 } 202 }
203 } 203 }
204 } 204 }
@@ -256,11 +256,11 @@ void LLPluginClassMedia::idle(void)
256 message.setValueReal("background_b", mBackgroundColor.mV[VZ]); 256 message.setValueReal("background_b", mBackgroundColor.mV[VZ]);
257 message.setValueReal("background_a", mBackgroundColor.mV[VW]); 257 message.setValueReal("background_a", mBackgroundColor.mV[VW]);
258 mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue. 258 mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue.
259 259
260 LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL; 260 LL_DEBUGS("PluginClassMedia") << "Sending size_change" << LL_ENDL;
261 } 261 }
262 } 262 }
263 263
264 if(mPlugin && mPlugin->isRunning()) 264 if(mPlugin && mPlugin->isRunning())
265 { 265 {
266 // Send queued messages 266 // Send queued messages
@@ -777,7 +777,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
777 mDirtyRect.unionWith(newDirtyRect); 777 mDirtyRect.unionWith(newDirtyRect);
778 } 778 }
779 779
780 LL_DEBUGS("Plugin") << "adjusted incoming rect is: (" 780 LL_DEBUGS("PluginClassMedia") << "adjusted incoming rect is: ("
781 << newDirtyRect.mLeft << ", " 781 << newDirtyRect.mLeft << ", "
782 << newDirtyRect.mTop << ", " 782 << newDirtyRect.mTop << ", "
783 << newDirtyRect.mRight << ", " 783 << newDirtyRect.mRight << ", "
@@ -841,9 +841,9 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
841 else if(message_name == "media_status") 841 else if(message_name == "media_status")
842 { 842 {
843 std::string status = message.getValue("status"); 843 std::string status = message.getValue("status");
844 844
845 LL_DEBUGS("Plugin") << "Status changed to: " << status << LL_ENDL; 845 LL_DEBUGS("PluginClassMedia") << "Status changed to: " << status << LL_ENDL;
846 846
847 if(status == "loading") 847 if(status == "loading")
848 { 848 {
849 mStatus = LLPluginClassMediaOwner::MEDIA_LOADING; 849 mStatus = LLPluginClassMediaOwner::MEDIA_LOADING;
@@ -933,7 +933,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
933 } 933 }
934 else 934 else
935 { 935 {
936 LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; 936 LL_WARNS("PluginClassMedia") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
937 } 937 }
938 } 938 }
939 else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER) 939 else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
@@ -990,7 +990,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
990 } 990 }
991 else 991 else
992 { 992 {
993 LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; 993 LL_WARNS("PluginClassMedia") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
994 } 994 }
995 } 995 }
996 else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) 996 else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
@@ -1001,9 +1001,9 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
1001// if(message_name == "message_name") 1001// if(message_name == "message_name")
1002// { 1002// {
1003// } 1003// }
1004// else 1004// else
1005 { 1005 {
1006 LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; 1006 LL_WARNS("PluginClassMedia") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
1007 } 1007 }
1008 } 1008 }
1009 1009
@@ -1230,6 +1230,6 @@ void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history)
1230 message.setValueLLSD("history", url_history); 1230 message.setValueLLSD("history", url_history);
1231 sendMessage(message); 1231 sendMessage(message);
1232 1232
1233 LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL; 1233 LL_DEBUGS("PluginClassMedia") << "Sending history" << LL_ENDL;
1234} 1234}
1235 1235
diff --git a/linden/indra/llplugin/llplugininstance.cpp b/linden/indra/llplugin/llplugininstance.cpp
index b822b9e..67457f2 100755
--- a/linden/indra/llplugin/llplugininstance.cpp
+++ b/linden/indra/llplugin/llplugininstance.cpp
@@ -36,8 +36,7 @@
36#include "linden_common.h" 36#include "linden_common.h"
37 37
38#include "llplugininstance.h" 38#include "llplugininstance.h"
39 39#include "aiaprpool.h"
40#include "llapr.h"
41 40
42/** Virtual destructor. */ 41/** Virtual destructor. */
43LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener() 42LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener()
@@ -86,16 +85,16 @@ int LLPluginInstance::load(std::string &plugin_file)
86 85
87 int result = apr_dso_load(&mDSOHandle, 86 int result = apr_dso_load(&mDSOHandle,
88 plugin_file.c_str(), 87 plugin_file.c_str(),
89 gAPRPoolp); 88 AIAPRRootPool::get()());
90 if(result != APR_SUCCESS) 89 if(result != APR_SUCCESS)
91 { 90 {
92 char buf[1024]; 91 char buf[1024];
93 apr_dso_error(mDSOHandle, buf, sizeof(buf)); 92 apr_dso_error(mDSOHandle, buf, sizeof(buf));
94 93
95 LL_WARNS("Plugin") << "apr_dso_load of " << plugin_file << " failed with error " << result << " , additional info string: " << buf << LL_ENDL; 94 LL_WARNS("PluginInstance") << "apr_dso_load of " << plugin_file << " failed with error " << result << " , additional info string: " << buf << LL_ENDL;
96 95
97 } 96 }
98 97
99 if(result == APR_SUCCESS) 98 if(result == APR_SUCCESS)
100 { 99 {
101 result = apr_dso_sym((apr_dso_handle_sym_t*)&init_function, 100 result = apr_dso_sym((apr_dso_handle_sym_t*)&init_function,
@@ -104,20 +103,20 @@ int LLPluginInstance::load(std::string &plugin_file)
104 103
105 if(result != APR_SUCCESS) 104 if(result != APR_SUCCESS)
106 { 105 {
107 LL_WARNS("Plugin") << "apr_dso_sym failed with error " << result << LL_ENDL; 106 LL_WARNS("PluginInstance") << "apr_dso_sym failed with error " << result << LL_ENDL;
108 } 107 }
109 } 108 }
110 109
111 if(result == APR_SUCCESS) 110 if(result == APR_SUCCESS)
112 { 111 {
113 result = init_function(staticReceiveMessage, (void*)this, &mPluginSendMessageFunction, &mPluginUserData); 112 result = init_function(staticReceiveMessage, (void*)this, &mPluginSendMessageFunction, &mPluginUserData);
114 113
115 if(result != APR_SUCCESS) 114 if(result != APR_SUCCESS)
116 { 115 {
117 LL_WARNS("Plugin") << "call to init function failed with error " << result << LL_ENDL; 116 LL_WARNS("PluginInstance") << "call to init function failed with error " << result << LL_ENDL;
118 } 117 }
119 } 118 }
120 119
121 return (int)result; 120 return (int)result;
122} 121}
123 122
@@ -130,12 +129,12 @@ void LLPluginInstance::sendMessage(const std::string &message)
130{ 129{
131 if(mPluginSendMessageFunction) 130 if(mPluginSendMessageFunction)
132 { 131 {
133 LL_DEBUGS("Plugin") << "sending message to plugin: \"" << message << "\"" << LL_ENDL; 132 LL_DEBUGS("PluginInstance") << "sending message to plugin: \"" << message << "\"" << LL_ENDL;
134 mPluginSendMessageFunction(message.c_str(), &mPluginUserData); 133 mPluginSendMessageFunction(message.c_str(), &mPluginUserData);
135 } 134 }
136 else 135 else
137 { 136 {
138 LL_WARNS("Plugin") << "dropping message: \"" << message << "\"" << LL_ENDL; 137 LL_WARNS("PluginInstance") << "dropping message: \"" << message << "\"" << LL_ENDL;
139 } 138 }
140} 139}
141 140
@@ -165,11 +164,11 @@ void LLPluginInstance::receiveMessage(const char *message_string)
165{ 164{
166 if(mOwner) 165 if(mOwner)
167 { 166 {
168 LL_DEBUGS("Plugin") << "processing incoming message: \"" << message_string << "\"" << LL_ENDL; 167 LL_DEBUGS("PluginInstance") << "processing incoming message: \"" << message_string << "\"" << LL_ENDL;
169 mOwner->receivePluginMessage(message_string); 168 mOwner->receivePluginMessage(message_string);
170 } 169 }
171 else 170 else
172 { 171 {
173 LL_WARNS("Plugin") << "dropping incoming message: \"" << message_string << "\"" << LL_ENDL; 172 LL_WARNS("PluginInstance") << "dropping incoming message: \"" << message_string << "\"" << LL_ENDL;
174 } 173 }
175} 174}
diff --git a/linden/indra/llplugin/llpluginmessagepipe.cpp b/linden/indra/llplugin/llpluginmessagepipe.cpp
index 8168b32..ac3a902 100755
--- a/linden/indra/llplugin/llpluginmessagepipe.cpp
+++ b/linden/indra/llplugin/llpluginmessagepipe.cpp
@@ -82,10 +82,10 @@ bool LLPluginMessagePipeOwner::writeMessageRaw(const std::string &message)
82 } 82 }
83 else 83 else
84 { 84 {
85 LL_WARNS("Plugin") << "dropping message: " << message << LL_ENDL; 85 LL_WARNS("PluginPipe") << "dropping message: " << message << LL_ENDL;
86 result = false; 86 result = false;
87 } 87 }
88 88
89 return result; 89 return result;
90} 90}
91 91
@@ -99,8 +99,6 @@ void LLPluginMessagePipeOwner::killMessagePipe(void)
99} 99}
100 100
101LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket): 101LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket):
102 mInputMutex(gAPRPoolp),
103 mOutputMutex(gAPRPoolp),
104 mOwner(owner), 102 mOwner(owner),
105 mSocket(socket) 103 mSocket(socket)
106{ 104{
@@ -179,18 +177,18 @@ bool LLPluginMessagePipe::pumpOutput()
179 { 177 {
180 // write any outgoing messages 178 // write any outgoing messages
181 size = (apr_size_t)mOutput.size(); 179 size = (apr_size_t)mOutput.size();
182 180
183 setSocketTimeout(0); 181 setSocketTimeout(0);
184 182
185// LL_INFOS("Plugin") << "before apr_socket_send, size = " << size << LL_ENDL; 183// LL_INFOS("PluginPipe") << "before apr_socket_send, size = " << size << LL_ENDL;
186 184
187 status = apr_socket_send( 185 status = apr_socket_send(
188 mSocket->getSocket(), 186 mSocket->getSocket(),
189 (const char*)mOutput.data(), 187 (const char*)mOutput.data(),
190 &size); 188 &size);
191 189
192// LL_INFOS("Plugin") << "after apr_socket_send, size = " << size << LL_ENDL; 190// LL_INFOS("PluginPipe") << "after apr_socket_send, size = " << size << LL_ENDL;
193 191
194 if(status == APR_SUCCESS) 192 if(status == APR_SUCCESS)
195 { 193 {
196 // success 194 // success
@@ -277,15 +275,15 @@ bool LLPluginMessagePipe::pumpInput(F64 timeout)
277 { 275 {
278 size = request_size; 276 size = request_size;
279 277
280// LL_INFOS("Plugin") << "before apr_socket_recv, size = " << size << LL_ENDL; 278// LL_INFOS("PluginPipe") << "before apr_socket_recv, size = " << size << LL_ENDL;
281 279
282 status = apr_socket_recv( 280 status = apr_socket_recv(
283 mSocket->getSocket(), 281 mSocket->getSocket(),
284 input_buf, 282 input_buf,
285 &size); 283 &size);
286 284
287// LL_INFOS("Plugin") << "after apr_socket_recv, size = " << size << LL_ENDL; 285// LL_INFOS("PluginPipe") << "after apr_socket_recv, size = " << size << LL_ENDL;
288 286
289 if(size > 0) 287 if(size > 0)
290 { 288 {
291 LLMutexLock lock(&mInputMutex); 289 LLMutexLock lock(&mInputMutex);
@@ -379,7 +377,7 @@ void LLPluginMessagePipe::processInput(void)
379 } 377 }
380 else 378 else
381 { 379 {
382 LL_WARNS("Plugin") << "!mOwner" << LL_ENDL; 380 LL_WARNS("PluginPipe") << "!mOwner" << LL_ENDL;
383 } 381 }
384 } 382 }
385 mInputMutex.unlock(); 383 mInputMutex.unlock();
diff --git a/linden/indra/llplugin/llpluginprocesschild.cpp b/linden/indra/llplugin/llpluginprocesschild.cpp
index 8dbf2b3..a1291c0 100755
--- a/linden/indra/llplugin/llpluginprocesschild.cpp
+++ b/linden/indra/llplugin/llpluginprocesschild.cpp
@@ -47,7 +47,7 @@ LLPluginProcessChild::LLPluginProcessChild()
47{ 47{
48 mState = STATE_UNINITIALIZED; 48 mState = STATE_UNINITIALIZED;
49 mInstance = NULL; 49 mInstance = NULL;
50 mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); 50 mSocket = LLSocket::create(LLSocket::STREAM_TCP);
51 mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz 51 mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz
52 mCPUElapsed = 0.0f; 52 mCPUElapsed = 0.0f;
53 mBlockingRequest = false; 53 mBlockingRequest = false;
@@ -94,18 +94,18 @@ void LLPluginProcessChild::idle(void)
94 } 94 }
95 else if(mSocketError != APR_SUCCESS) 95 else if(mSocketError != APR_SUCCESS)
96 { 96 {
97 LL_INFOS("Plugin") << "message pipe is in error state (" << mSocketError << "), moving to STATE_ERROR"<< LL_ENDL; 97 LL_INFOS("PluginChild") << "message pipe is in error state (" << mSocketError << "), moving to STATE_ERROR"<< LL_ENDL;
98 setState(STATE_ERROR); 98 setState(STATE_ERROR);
99 } 99 }
100 100
101 if((mState > STATE_INITIALIZED) && (mMessagePipe == NULL)) 101 if((mState > STATE_INITIALIZED) && (mMessagePipe == NULL))
102 { 102 {
103 // The pipe has been closed -- we're done. 103 // The pipe has been closed -- we're done.
104 // TODO: This could be slightly more subtle, but I'm not sure it needs to be. 104 // TODO: This could be slightly more subtle, but I'm not sure it needs to be.
105 LL_INFOS("Plugin") << "message pipe went away, moving to STATE_ERROR"<< LL_ENDL; 105 LL_INFOS("PluginChild") << "message pipe went away, moving to STATE_ERROR"<< LL_ENDL;
106 setState(STATE_ERROR); 106 setState(STATE_ERROR);
107 } 107 }
108 108
109 // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState(). 109 // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState().
110 // USE THIS CAREFULLY, since it can starve other code. Specifically make sure there's no way to get into a closed cycle and never return. 110 // USE THIS CAREFULLY, since it can starve other code. Specifically make sure there's no way to get into a closed cycle and never return.
111 // When in doubt, don't do it. 111 // When in doubt, don't do it.
@@ -291,17 +291,17 @@ void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
291 if (mInstance) 291 if (mInstance)
292 { 292 {
293 std::string buffer = message.generate(); 293 std::string buffer = message.generate();
294 294
295 LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL; 295 LL_DEBUGS("PluginChild") << "Sending to plugin: " << buffer << LL_ENDL;
296 LLTimer elapsed; 296 LLTimer elapsed;
297 297
298 mInstance->sendMessage(buffer); 298 mInstance->sendMessage(buffer);
299 299
300 mCPUElapsed += elapsed.getElapsedTimeF64(); 300 mCPUElapsed += elapsed.getElapsedTimeF64();
301 } 301 }
302 else 302 else
303 { 303 {
304 LL_WARNS("Plugin") << "mInstance == NULL" << LL_ENDL; 304 LL_WARNS("PluginChild") << "mInstance == NULL" << LL_ENDL;
305 } 305 }
306} 306}
307 307
@@ -309,7 +309,7 @@ void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message)
309{ 309{
310 std::string buffer = message.generate(); 310 std::string buffer = message.generate();
311 311
312 LL_DEBUGS("Plugin") << "Sending to parent: " << buffer << LL_ENDL; 312 LL_DEBUGS("PluginChild") << "Sending to parent: " << buffer << LL_ENDL;
313 313
314 writeMessageRaw(buffer); 314 writeMessageRaw(buffer);
315} 315}
@@ -318,7 +318,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
318{ 318{
319 // Incoming message from the TCP Socket 319 // Incoming message from the TCP Socket
320 320
321 LL_DEBUGS("Plugin") << "Received from parent: " << message << LL_ENDL; 321 LL_DEBUGS("PluginChild") << "Received from parent: " << message << LL_ENDL;
322 322
323 // Decode this message 323 // Decode this message
324 LLPluginMessage parsed; 324 LLPluginMessage parsed;
@@ -365,7 +365,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
365 if(iter != mSharedMemoryRegions.end()) 365 if(iter != mSharedMemoryRegions.end())
366 { 366 {
367 // Need to remove the old region first 367 // Need to remove the old region first
368 LL_WARNS("Plugin") << "Adding a duplicate shared memory segment!" << LL_ENDL; 368 LL_WARNS("PluginChild") << "Adding a duplicate shared memory segment!" << LL_ENDL;
369 } 369 }
370 else 370 else
371 { 371 {
@@ -392,7 +392,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
392 } 392 }
393 else 393 else
394 { 394 {
395 LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL; 395 LL_WARNS("PluginChild") << "Couldn't create a shared memory segment!" << LL_ENDL;
396 delete region; 396 delete region;
397 } 397 }
398 } 398 }
@@ -411,7 +411,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
411 } 411 }
412 else 412 else
413 { 413 {
414 LL_WARNS("Plugin") << "shm_remove for unknown memory segment!" << LL_ENDL; 414 LL_WARNS("PluginChild") << "shm_remove for unknown memory segment!" << LL_ENDL;
415 } 415 }
416 } 416 }
417 else if(message_name == "sleep_time") 417 else if(message_name == "sleep_time")
@@ -421,12 +421,12 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
421 else if(message_name == "crash") 421 else if(message_name == "crash")
422 { 422 {
423 // Crash the plugin 423 // Crash the plugin
424 LL_ERRS("Plugin") << "Plugin crash requested." << LL_ENDL; 424 LL_ERRS("PluginChild") << "Plugin crash requested." << LL_ENDL;
425 } 425 }
426 else if(message_name == "hang") 426 else if(message_name == "hang")
427 { 427 {
428 // Hang the plugin 428 // Hang the plugin
429 LL_WARNS("Plugin") << "Plugin hang requested." << LL_ENDL; 429 LL_WARNS("PluginChild") << "Plugin hang requested." << LL_ENDL;
430 while(1) 430 while(1)
431 { 431 {
432 // wheeeeeeeee...... 432 // wheeeeeeeee......
@@ -434,7 +434,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
434 } 434 }
435 else 435 else
436 { 436 {
437 LL_WARNS("Plugin") << "Unknown internal message from parent: " << message_name << LL_ENDL; 437 LL_WARNS("PluginChild") << "Unknown internal message from parent: " << message_name << LL_ENDL;
438 } 438 }
439 } 439 }
440 } 440 }
@@ -449,17 +449,17 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
449 } 449 }
450} 450}
451 451
452/* virtual */ 452/* virtual */
453void LLPluginProcessChild::receivePluginMessage(const std::string &message) 453void LLPluginProcessChild::receivePluginMessage(const std::string &message)
454{ 454{
455 LL_DEBUGS("Plugin") << "Received from plugin: " << message << LL_ENDL; 455 LL_DEBUGS("PluginChild") << "Received from plugin: " << message << LL_ENDL;
456 456
457 if(mBlockingRequest) 457 if(mBlockingRequest)
458 { 458 {
459 // 459 //
460 LL_ERRS("Plugin") << "Can't send a message while already waiting on a blocking request -- aborting!" << LL_ENDL; 460 LL_ERRS("PluginChild") << "Can't send a message while already waiting on a blocking request -- aborting!" << LL_ENDL;
461 } 461 }
462 462
463 // Incoming message from the plugin instance 463 // Incoming message from the plugin instance
464 bool passMessage = true; 464 bool passMessage = true;
465 465
@@ -523,18 +523,18 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
523 } 523 }
524 else 524 else
525 { 525 {
526 LL_WARNS("Plugin") << "shm_remove_response for unknown memory segment!" << LL_ENDL; 526 LL_WARNS("PluginChild") << "shm_remove_response for unknown memory segment!" << LL_ENDL;
527 } 527 }
528 } 528 }
529 } 529 }
530 } 530 }
531 531
532 if(passMessage) 532 if(passMessage)
533 { 533 {
534 LL_DEBUGS("Plugin") << "Passing through to parent: " << message << LL_ENDL; 534 LL_DEBUGS("PluginChild") << "Passing through to parent: " << message << LL_ENDL;
535 writeMessageRaw(message); 535 writeMessageRaw(message);
536 } 536 }
537 537
538 while(mBlockingRequest) 538 while(mBlockingRequest)
539 { 539 {
540 // The plugin wants to block and wait for a response to this message. 540 // The plugin wants to block and wait for a response to this message.
@@ -552,8 +552,8 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
552 552
553void LLPluginProcessChild::setState(EState state) 553void LLPluginProcessChild::setState(EState state)
554{ 554{
555 LL_DEBUGS("Plugin") << "setting state to " << state << LL_ENDL; 555 LL_DEBUGS("PluginChild") << "setting state to " << state << LL_ENDL;
556 mState = state; 556 mState = state;
557}; 557};
558 558
559void LLPluginProcessChild::deliverQueuedMessages() 559void LLPluginProcessChild::deliverQueuedMessages()
diff --git a/linden/indra/llplugin/llpluginprocessparent.cpp b/linden/indra/llplugin/llpluginprocessparent.cpp
index 8fd18ef..5a66279 100755
--- a/linden/indra/llplugin/llpluginprocessparent.cpp
+++ b/linden/indra/llplugin/llpluginprocessparent.cpp
@@ -49,6 +49,7 @@ LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
49 49
50bool LLPluginProcessParent::sUseReadThread = false; 50bool LLPluginProcessParent::sUseReadThread = false;
51apr_pollset_t *LLPluginProcessParent::sPollSet = NULL; 51apr_pollset_t *LLPluginProcessParent::sPollSet = NULL;
52AIAPRPool LLPluginProcessParent::sPollSetPool;
52bool LLPluginProcessParent::sPollsetNeedsRebuild = false; 53bool LLPluginProcessParent::sPollsetNeedsRebuild = false;
53LLMutex *LLPluginProcessParent::sInstancesMutex; 54LLMutex *LLPluginProcessParent::sInstancesMutex;
54std::list<LLPluginProcessParent*> LLPluginProcessParent::sInstances; 55std::list<LLPluginProcessParent*> LLPluginProcessParent::sInstances;
@@ -59,7 +60,7 @@ class LLPluginProcessParentPollThread: public LLThread
59{ 60{
60public: 61public:
61 LLPluginProcessParentPollThread() : 62 LLPluginProcessParentPollThread() :
62 LLThread("LLPluginProcessParentPollThread", gAPRPoolp) 63 LLThread("LLPluginProcessParentPollThread")
63 { 64 {
64 } 65 }
65protected: 66protected:
@@ -84,12 +85,11 @@ protected:
84 85
85}; 86};
86 87
87LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): 88LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
88 mIncomingQueueMutex(gAPRPoolp)
89{ 89{
90 if(!sInstancesMutex) 90 if(!sInstancesMutex)
91 { 91 {
92 sInstancesMutex = new LLMutex(gAPRPoolp); 92 sInstancesMutex = new LLMutex;
93 } 93 }
94 94
95 mOwner = owner; 95 mOwner = owner;
@@ -102,6 +102,7 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
102 mBlocked = false; 102 mBlocked = false;
103 mPolledInput = false; 103 mPolledInput = false;
104 mPollFD.client_data = NULL; 104 mPollFD.client_data = NULL;
105 mPollFDPool.create();
105 106
106 mPluginLaunchTimeout = 60.0f; 107 mPluginLaunchTimeout = 60.0f;
107 mPluginLockupTimeout = 15.0f; 108 mPluginLockupTimeout = 15.0f;
@@ -119,7 +120,7 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
119 120
120LLPluginProcessParent::~LLPluginProcessParent() 121LLPluginProcessParent::~LLPluginProcessParent()
121{ 122{
122 LL_DEBUGS("Plugin") << "destructor" << LL_ENDL; 123 LL_DEBUGS("PluginParent") << "destructor" << LL_ENDL;
123 124
124 // Remove from the global list before beginning destruction. 125 // Remove from the global list before beginning destruction.
125 { 126 {
@@ -177,44 +178,28 @@ void LLPluginProcessParent::init(const std::string &launcher_filename, const std
177bool LLPluginProcessParent::accept() 178bool LLPluginProcessParent::accept()
178{ 179{
179 bool result = false; 180 bool result = false;
180
181 apr_status_t status = APR_EGENERAL; 181 apr_status_t status = APR_EGENERAL;
182 apr_socket_t *new_socket = NULL;
183
184 status = apr_socket_accept(
185 &new_socket,
186 mListenSocket->getSocket(),
187 gAPRPoolp);
188 182
183 mSocket = LLSocket::create(status, mListenSocket);
189 184
190 if(status == APR_SUCCESS) 185 if(status == APR_SUCCESS)
191 { 186 {
192// llinfos << "SUCCESS" << llendl; 187// llinfos << "SUCCESS" << llendl;
193 // Success. Create a message pipe on the new socket 188 // Success. Create a message pipe on the new socket
194
195 // we MUST create a new pool for the LLSocket, since it will take ownership of it and delete it in its destructor!
196 apr_pool_t* new_pool = NULL;
197 status = apr_pool_create(&new_pool, gAPRPoolp);
198
199 mSocket = LLSocket::create(new_socket, new_pool);
200 new LLPluginMessagePipe(this, mSocket); 189 new LLPluginMessagePipe(this, mSocket);
201 190
202 result = true; 191 result = true;
203 } 192 }
204 else if(APR_STATUS_IS_EAGAIN(status))
205 {
206// llinfos << "EAGAIN" << llendl;
207
208 // No incoming connections. This is not an error.
209 status = APR_SUCCESS;
210 }
211 else 193 else
212 { 194 {
213// llinfos << "Error:" << llendl; 195 mSocket.reset();
214 ll_apr_warn_status(status); 196 // EAGAIN means "No incoming connections". This is not an error.
215 197 if (!APR_STATUS_IS_EAGAIN(status))
216 // Some other error. 198 {
217 errorState(); 199 // Some other error.
200 ll_apr_warn_status(status);
201 errorState();
202 }
218 } 203 }
219 204
220 return result; 205 return result;
@@ -264,10 +249,10 @@ void LLPluginProcessParent::idle(void)
264 else if(mSocketError != APR_SUCCESS) 249 else if(mSocketError != APR_SUCCESS)
265 { 250 {
266 // The socket is in an error state -- the plugin is gone. 251 // The socket is in an error state -- the plugin is gone.
267 LL_WARNS("Plugin") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL; 252 LL_WARNS("PluginParent") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL;
268 errorState(); 253 errorState();
269 } 254 }
270 } 255 }
271 256
272 // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState(). 257 // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState().
273 // USE THIS CAREFULLY, since it can starve other code. Specifically make sure there's no way to get into a closed cycle and never return. 258 // USE THIS CAREFULLY, since it can starve other code. Specifically make sure there's no way to get into a closed cycle and never return.
@@ -283,7 +268,7 @@ void LLPluginProcessParent::idle(void)
283 268
284 apr_status_t status = APR_SUCCESS; 269 apr_status_t status = APR_SUCCESS;
285 apr_sockaddr_t* addr = NULL; 270 apr_sockaddr_t* addr = NULL;
286 mListenSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); 271 mListenSocket = LLSocket::create(LLSocket::STREAM_TCP);
287 mBoundPort = 0; 272 mBoundPort = 0;
288 273
289 // This code is based on parts of LLSocket::create() in lliosocket.cpp. 274 // This code is based on parts of LLSocket::create() in lliosocket.cpp.
@@ -294,7 +279,7 @@ void LLPluginProcessParent::idle(void)
294 APR_INET, 279 APR_INET,
295 0, // port 0 = ephemeral ("find me a port") 280 0, // port 0 = ephemeral ("find me a port")
296 0, 281 0,
297 gAPRPoolp); 282 AIAPRRootPool::get()());
298 283
299 if(ll_apr_warn_status(status)) 284 if(ll_apr_warn_status(status))
300 { 285 {
@@ -327,15 +312,15 @@ void LLPluginProcessParent::idle(void)
327 312
328 if(mBoundPort == 0) 313 if(mBoundPort == 0)
329 { 314 {
330 LL_WARNS("Plugin") << "Bound port number unknown, bailing out." << LL_ENDL; 315 LL_WARNS("PluginParent") << "Bound port number unknown, bailing out." << LL_ENDL;
331 316
332 killSockets(); 317 killSockets();
333 errorState(); 318 errorState();
334 break; 319 break;
335 } 320 }
336 } 321 }
337 322
338 LL_DEBUGS("Plugin") << "Bound tcp socket to port: " << addr->port << LL_ENDL; 323 LL_DEBUGS("PluginParent") << "Bound tcp socket to port: " << addr->port << LL_ENDL;
339 324
340 // Make the listen socket non-blocking 325 // Make the listen socket non-blocking
341 status = apr_socket_opt_set(mListenSocket->getSocket(), APR_SO_NONBLOCK, 1); 326 status = apr_socket_opt_set(mListenSocket->getSocket(), APR_SO_NONBLOCK, 1);
@@ -458,8 +443,8 @@ void LLPluginProcessParent::idle(void)
458 break; 443 break;
459 444
460 case STATE_HELLO: 445 case STATE_HELLO:
461 LL_DEBUGS("Plugin") << "received hello message" << LL_ENDL; 446 LL_DEBUGS("PluginParent") << "received hello message" << LL_ENDL;
462 447
463 // Send the message to load the plugin 448 // Send the message to load the plugin
464 { 449 {
465 LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin"); 450 LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
@@ -492,7 +477,7 @@ void LLPluginProcessParent::idle(void)
492 } 477 }
493 else if(pluginLockedUp()) 478 else if(pluginLockedUp())
494 { 479 {
495 LL_WARNS("Plugin") << "timeout in exiting state, bailing out" << LL_ENDL; 480 LL_WARNS("PluginParent") << "timeout in exiting state, bailing out" << LL_ENDL;
496 errorState(); 481 errorState();
497 } 482 }
498 break; 483 break;
@@ -589,11 +574,11 @@ void LLPluginProcessParent::sendMessage(const LLPluginMessage &message)
589 // reset the heartbeat timer, since there will have been no heartbeats while the plugin was blocked. 574 // reset the heartbeat timer, since there will have been no heartbeats while the plugin was blocked.
590 mHeartbeat.setTimerExpirySec(mPluginLockupTimeout); 575 mHeartbeat.setTimerExpirySec(mPluginLockupTimeout);
591 } 576 }
592 577
593 std::string buffer = message.generate(); 578 std::string buffer = message.generate();
594 LL_DEBUGS("Plugin") << "Sending: " << buffer << LL_ENDL; 579 LL_DEBUGS("PluginParent") << "Sending: " << buffer << LL_ENDL;
595 writeMessageRaw(buffer); 580 writeMessageRaw(buffer);
596 581
597 // Try to send message immediately. 582 // Try to send message immediately.
598 if(mMessagePipe) 583 if(mMessagePipe)
599 { 584 {
@@ -617,7 +602,8 @@ void LLPluginProcessParent::setMessagePipe(LLPluginMessagePipe *message_pipe)
617 if(message_pipe != NULL) 602 if(message_pipe != NULL)
618 { 603 {
619 // Set up the apr_pollfd_t 604 // Set up the apr_pollfd_t
620 mPollFD.p = gAPRPoolp; 605
606 mPollFD.p = mPollFDPool();
621 mPollFD.desc_type = APR_POLL_SOCKET; 607 mPollFD.desc_type = APR_POLL_SOCKET;
622 mPollFD.reqevents = APR_POLLIN|APR_POLLERR|APR_POLLHUP; 608 mPollFD.reqevents = APR_POLLIN|APR_POLLERR|APR_POLLHUP;
623 mPollFD.rtnevents = 0; 609 mPollFD.rtnevents = 0;
@@ -664,6 +650,7 @@ void LLPluginProcessParent::updatePollset()
664 // delete the existing pollset. 650 // delete the existing pollset.
665 apr_pollset_destroy(sPollSet); 651 apr_pollset_destroy(sPollSet);
666 sPollSet = NULL; 652 sPollSet = NULL;
653 sPollSetPool.destroy();
667 } 654 }
668 655
669 std::list<LLPluginProcessParent*>::iterator iter; 656 std::list<LLPluginProcessParent*>::iterator iter;
@@ -686,12 +673,14 @@ void LLPluginProcessParent::updatePollset()
686 { 673 {
687#ifdef APR_POLLSET_NOCOPY 674#ifdef APR_POLLSET_NOCOPY
688 // The pollset doesn't exist yet. Create it now. 675 // The pollset doesn't exist yet. Create it now.
689 apr_status_t status = apr_pollset_create(&sPollSet, count, gAPRPoolp, APR_POLLSET_NOCOPY); 676 sPollSetPool.create();
677 apr_status_t status = apr_pollset_create(&sPollSet, count, sPollSetPool(), APR_POLLSET_NOCOPY);
690 if(status != APR_SUCCESS) 678 if(status != APR_SUCCESS)
691 { 679 {
692#endif // APR_POLLSET_NOCOPY 680#endif // APR_POLLSET_NOCOPY
693 LL_WARNS("PluginPoll") << "Couldn't create pollset. Falling back to non-pollset mode." << LL_ENDL; 681 LL_WARNS("PluginPoll") << "Couldn't create pollset. Falling back to non-pollset mode." << LL_ENDL;
694 sPollSet = NULL; 682 sPollSet = NULL;
683 sPollSetPool.destroy();
695#ifdef APR_POLLSET_NOCOPY 684#ifdef APR_POLLSET_NOCOPY
696 } 685 }
697 else 686 else
@@ -851,8 +840,8 @@ void LLPluginProcessParent::servicePoll()
851 840
852void LLPluginProcessParent::receiveMessageRaw(const std::string &message) 841void LLPluginProcessParent::receiveMessageRaw(const std::string &message)
853{ 842{
854 LL_DEBUGS("Plugin") << "Received: " << message << LL_ENDL; 843 LL_DEBUGS("PluginParent") << "Received: " << message << LL_ENDL;
855 844
856 LLPluginMessage parsed; 845 LLPluginMessage parsed;
857 if(parsed.parse(message) != -1) 846 if(parsed.parse(message) != -1)
858 { 847 {
@@ -918,19 +907,19 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
918 } 907 }
919 else 908 else
920 { 909 {
921 LL_WARNS("Plugin") << "received hello message in wrong state -- bailing out" << LL_ENDL; 910 LL_WARNS("PluginParent") << "received hello message in wrong state -- bailing out" << LL_ENDL;
922 errorState(); 911 errorState();
923 } 912 }
924 913
925 } 914 }
926 else if(message_name == "load_plugin_response") 915 else if(message_name == "load_plugin_response")
927 { 916 {
928 if(mState == STATE_LOADING) 917 if(mState == STATE_LOADING)
929 { 918 {
930 // Plugin has been loaded. 919 // Plugin has been loaded.
931 920
932 mPluginVersionString = message.getValue("plugin_version"); 921 mPluginVersionString = message.getValue("plugin_version");
933 LL_INFOS("Plugin") << "plugin version string: " << mPluginVersionString << LL_ENDL; 922 LL_INFOS("PluginParent") << "plugin version string: " << mPluginVersionString << LL_ENDL;
934 923
935 // Check which message classes/versions the plugin supports. 924 // Check which message classes/versions the plugin supports.
936 // TODO: check against current versions 925 // TODO: check against current versions
@@ -939,9 +928,9 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
939 LLSD::map_iterator iter; 928 LLSD::map_iterator iter;
940 for(iter = mMessageClassVersions.beginMap(); iter != mMessageClassVersions.endMap(); iter++) 929 for(iter = mMessageClassVersions.beginMap(); iter != mMessageClassVersions.endMap(); iter++)
941 { 930 {
942 LL_INFOS("Plugin") << "message class: " << iter->first << " -> version: " << iter->second.asString() << LL_ENDL; 931 LL_INFOS("PluginParent") << "message class: " << iter->first << " -> version: " << iter->second.asString() << LL_ENDL;
943 } 932 }
944 933
945 // Send initial sleep time 934 // Send initial sleep time
946 setSleepTime(mSleepTime, true); 935 setSleepTime(mSleepTime, true);
947 936
@@ -949,7 +938,7 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
949 } 938 }
950 else 939 else
951 { 940 {
952 LL_WARNS("Plugin") << "received load_plugin_response message in wrong state -- bailing out" << LL_ENDL; 941 LL_WARNS("PluginParent") << "received load_plugin_response message in wrong state -- bailing out" << LL_ENDL;
953 errorState(); 942 errorState();
954 } 943 }
955 } 944 }
@@ -960,8 +949,8 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
960 949
961 mCPUUsage = message.getValueReal("cpu_usage"); 950 mCPUUsage = message.getValueReal("cpu_usage");
962 951
963 LL_DEBUGS("Plugin") << "cpu usage reported as " << mCPUUsage << LL_ENDL; 952 LL_DEBUGS("PluginSpam") << "cpu usage reported as " << mCPUUsage << LL_ENDL;
964 953
965 } 954 }
966 else if(message_name == "shm_add_response") 955 else if(message_name == "shm_add_response")
967 { 956 {
@@ -983,7 +972,7 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
983 } 972 }
984 else 973 else
985 { 974 {
986 LL_WARNS("Plugin") << "Unknown internal message from child: " << message_name << LL_ENDL; 975 LL_WARNS("PluginParent") << "Unknown internal message from child: " << message_name << LL_ENDL;
987 } 976 }
988 } 977 }
989 else 978 else
@@ -1015,7 +1004,7 @@ std::string LLPluginProcessParent::addSharedMemory(size_t size)
1015 } 1004 }
1016 else 1005 else
1017 { 1006 {
1018 LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL; 1007 LL_WARNS("PluginParent") << "Couldn't create a shared memory segment!" << LL_ENDL;
1019 1008
1020 // Don't leak 1009 // Don't leak
1021 delete region; 1010 delete region;
@@ -1037,7 +1026,7 @@ void LLPluginProcessParent::removeSharedMemory(const std::string &name)
1037 } 1026 }
1038 else 1027 else
1039 { 1028 {
1040 LL_WARNS("Plugin") << "Request to remove an unknown shared memory segment." << LL_ENDL; 1029 LL_WARNS("PluginParent") << "Request to remove an unknown shared memory segment." << LL_ENDL;
1041 } 1030 }
1042} 1031}
1043size_t LLPluginProcessParent::getSharedMemorySize(const std::string &name) 1032size_t LLPluginProcessParent::getSharedMemorySize(const std::string &name)
@@ -1084,25 +1073,25 @@ std::string LLPluginProcessParent::getPluginVersion(void)
1084 1073
1085void LLPluginProcessParent::setState(EState state) 1074void LLPluginProcessParent::setState(EState state)
1086{ 1075{
1087 LL_DEBUGS("Plugin") << "setting state to " << stateToString(state) << LL_ENDL; 1076 LL_DEBUGS("PluginParent") << "setting state to " << stateToString(state) << LL_ENDL;
1088 mState = state; 1077 mState = state;
1089}; 1078};
1090 1079
1091bool LLPluginProcessParent::pluginLockedUpOrQuit() 1080bool LLPluginProcessParent::pluginLockedUpOrQuit()
1092{ 1081{
1093 bool result = false; 1082 bool result = false;
1094 1083
1095 if(!mProcess.isRunning()) 1084 if(!mProcess.isRunning())
1096 { 1085 {
1097 LL_WARNS("Plugin") << "child exited" << LL_ENDL; 1086 LL_WARNS("PluginParent") << "child exited" << LL_ENDL;
1098 result = true; 1087 result = true;
1099 } 1088 }
1100 else if(pluginLockedUp()) 1089 else if(pluginLockedUp())
1101 { 1090 {
1102 LL_WARNS("Plugin") << "timeout" << LL_ENDL; 1091 LL_WARNS("PluginParent") << "timeout" << LL_ENDL;
1103 result = true; 1092 result = true;
1104 } 1093 }
1105 1094
1106 return result; 1095 return result;
1107} 1096}
1108 1097
diff --git a/linden/indra/llplugin/llpluginprocessparent.h b/linden/indra/llplugin/llpluginprocessparent.h
index 95f5f70..bba3643 100755
--- a/linden/indra/llplugin/llpluginprocessparent.h
+++ b/linden/indra/llplugin/llpluginprocessparent.h
@@ -186,7 +186,9 @@ private:
186 186
187 static bool sUseReadThread; 187 static bool sUseReadThread;
188 apr_pollfd_t mPollFD; 188 apr_pollfd_t mPollFD;
189 AIAPRPool mPollFDPool;
189 static apr_pollset_t *sPollSet; 190 static apr_pollset_t *sPollSet;
191 static AIAPRPool sPollSetPool;
190 static bool sPollsetNeedsRebuild; 192 static bool sPollsetNeedsRebuild;
191 static LLMutex *sInstancesMutex; 193 static LLMutex *sInstancesMutex;
192 static std::list<LLPluginProcessParent*> sInstances; 194 static std::list<LLPluginProcessParent*> sInstances;
diff --git a/linden/indra/llplugin/llpluginsharedmemory.cpp b/linden/indra/llplugin/llpluginsharedmemory.cpp
index e8a411a..6becb8d 100755
--- a/linden/indra/llplugin/llpluginsharedmemory.cpp
+++ b/linden/indra/llplugin/llpluginsharedmemory.cpp
@@ -84,6 +84,8 @@
84 #include <sys/mman.h> 84 #include <sys/mman.h>
85 #include <errno.h> 85 #include <errno.h>
86#elif USE_WIN32_SHARED_MEMORY 86#elif USE_WIN32_SHARED_MEMORY
87# define WIN32_LEAN_AND_MEAN
88# include <winsock2.h>
87#include <windows.h> 89#include <windows.h>
88#endif // USE_APR_SHARED_MEMORY 90#endif // USE_APR_SHARED_MEMORY
89 91
@@ -201,7 +203,8 @@ bool LLPluginSharedMemory::create(size_t size)
201 mName += createName(); 203 mName += createName();
202 mSize = size; 204 mSize = size;
203 205
204 apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), gAPRPoolp ); 206 mPool.create();
207 apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), mPool());
205 208
206 if(ll_apr_warn_status(status)) 209 if(ll_apr_warn_status(status))
207 { 210 {
@@ -224,7 +227,7 @@ bool LLPluginSharedMemory::destroy(void)
224 } 227 }
225 mImpl->mAprSharedMemory = NULL; 228 mImpl->mAprSharedMemory = NULL;
226 } 229 }
227 230 mPool.destroy();
228 return true; 231 return true;
229} 232}
230 233
@@ -233,7 +236,8 @@ bool LLPluginSharedMemory::attach(const std::string &name, size_t size)
233 mName = name; 236 mName = name;
234 mSize = size; 237 mSize = size;
235 238
236 apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), gAPRPoolp ); 239 mPool.create();
240 apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), mPool() );
237 241
238 if(ll_apr_warn_status(status)) 242 if(ll_apr_warn_status(status))
239 { 243 {
@@ -255,6 +259,7 @@ bool LLPluginSharedMemory::detach(void)
255 } 259 }
256 mImpl->mAprSharedMemory = NULL; 260 mImpl->mAprSharedMemory = NULL;
257 } 261 }
262 mPool.destroy();
258 263
259 return true; 264 return true;
260} 265}
diff --git a/linden/indra/llplugin/llpluginsharedmemory.h b/linden/indra/llplugin/llpluginsharedmemory.h
index 081d311..669a3e4 100755
--- a/linden/indra/llplugin/llpluginsharedmemory.h
+++ b/linden/indra/llplugin/llpluginsharedmemory.h
@@ -35,6 +35,8 @@
35#ifndef LL_LLPLUGINSHAREDMEMORY_H 35#ifndef LL_LLPLUGINSHAREDMEMORY_H
36#define LL_LLPLUGINSHAREDMEMORY_H 36#define LL_LLPLUGINSHAREDMEMORY_H
37 37
38#include "aiaprpool.h"
39
38class LLPluginSharedMemoryPlatformImpl; 40class LLPluginSharedMemoryPlatformImpl;
39 41
40/** 42/**
@@ -115,6 +117,7 @@ private:
115 bool close(void); 117 bool close(void);
116 bool unlink(void); 118 bool unlink(void);
117 119
120 AIAPRPool mPool;
118 std::string mName; 121 std::string mName;
119 size_t mSize; 122 size_t mSize;
120 void *mMappedAddress; 123 void *mMappedAddress;
diff --git a/linden/indra/llplugin/slplugin/slplugin.cpp b/linden/indra/llplugin/slplugin/slplugin.cpp
index 64c087b..878577b 100755
--- a/linden/indra/llplugin/slplugin/slplugin.cpp
+++ b/linden/indra/llplugin/slplugin/slplugin.cpp
@@ -78,6 +78,8 @@ static void crash_handler(int sig)
78#endif 78#endif
79 79
80#if LL_WINDOWS 80#if LL_WINDOWS
81# define WIN32_LEAN_AND_MEAN
82# include <winsock2.h>
81#include <windows.h> 83#include <windows.h>
82//////////////////////////////////////////////////////////////////////////////// 84////////////////////////////////////////////////////////////////////////////////
83// Our exception handler - will probably just exit and the host application 85// Our exception handler - will probably just exit and the host application
@@ -183,8 +185,6 @@ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
183int main(int argc, char **argv) 185int main(int argc, char **argv)
184#endif 186#endif
185{ 187{
186 ll_init_apr();
187
188 // Set up llerror logging 188 // Set up llerror logging
189 { 189 {
190 LLError::initForApplication("."); 190 LLError::initForApplication(".");
@@ -400,8 +400,6 @@ int main(int argc, char **argv)
400 400
401 delete plugin; 401 delete plugin;
402 402
403 ll_cleanup_apr();
404
405 return 0; 403 return 0;
406} 404}
407 405
diff --git a/linden/indra/llvfs/llpidlock.h b/linden/indra/llvfs/llpidlock.h
index efcfd91..6103599 100755
--- a/linden/indra/llvfs/llpidlock.h
+++ b/linden/indra/llvfs/llpidlock.h
@@ -39,6 +39,8 @@ class LLFrameTimer;
39 39
40#if LL_WINDOWS //For windows platform. 40#if LL_WINDOWS //For windows platform.
41 41
42# define WIN32_LEAN_AND_MEAN
43# include <winsock2.h>
42#include <windows.h> 44#include <windows.h>
43 45
44#else //Everyone Else 46#else //Everyone Else
diff --git a/linden/indra/llvfs/llvfs.cpp b/linden/indra/llvfs/llvfs.cpp
index dea8c9c..654dfa1 100644
--- a/linden/indra/llvfs/llvfs.cpp
+++ b/linden/indra/llvfs/llvfs.cpp
@@ -237,7 +237,7 @@ const S32 LLVFSFileBlock::SERIAL_SIZE = 34;
237LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename, const BOOL read_only, const U32 presize, const BOOL remove_after_crash) 237LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename, const BOOL read_only, const U32 presize, const BOOL remove_after_crash)
238: mRemoveAfterCrash(remove_after_crash) 238: mRemoveAfterCrash(remove_after_crash)
239{ 239{
240 mDataMutex = new LLMutex(0); 240 mDataMutex = new LLMutex;
241 241
242 S32 i; 242 S32 i;
243 for (i = 0; i < VFSLOCK_COUNT; i++) 243 for (i = 0; i < VFSLOCK_COUNT; i++)
diff --git a/linden/indra/llwindow/GL/glh_extensions.h b/linden/indra/llwindow/GL/glh_extensions.h
index b936b5d..5b149c9 100644
--- a/linden/indra/llwindow/GL/glh_extensions.h
+++ b/linden/indra/llwindow/GL/glh_extensions.h
@@ -17,6 +17,8 @@
17#include <stdio.h> 17#include <stdio.h>
18 18
19#ifdef _WIN32 19#ifdef _WIN32
20# define WIN32_LEAN_AND_MEAN
21# include <winsock2.h>
20# include <windows.h> 22# include <windows.h>
21#endif 23#endif
22 24
diff --git a/linden/indra/media_plugins/CMakeLists.txt b/linden/indra/media_plugins/CMakeLists.txt
index a4c6b18..7c224b4 100755
--- a/linden/indra/media_plugins/CMakeLists.txt
+++ b/linden/indra/media_plugins/CMakeLists.txt
@@ -8,8 +8,14 @@ if (LINUX)
8 add_subdirectory(gstreamer010) 8 add_subdirectory(gstreamer010)
9endif (LINUX) 9endif (LINUX)
10 10
11if (WINDOWS OR DARWIN) 11# We use gstreamer for audio, quicktime for media on win-- MC
12if (WINDOWS)
13 add_subdirectory(gstreamer010)
14 add_subdirectory(quicktime)
15endif (WINDOWS)
16
17if (DARWIN)
12 add_subdirectory(quicktime) 18 add_subdirectory(quicktime)
13endif (WINDOWS OR DARWIN) 19endif (DARWIN)
14 20
15add_subdirectory(example) 21add_subdirectory(example)
diff --git a/linden/indra/media_plugins/gstreamer010/CMakeLists.txt b/linden/indra/media_plugins/gstreamer010/CMakeLists.txt
index 4401e64..e405dc6 100644
--- a/linden/indra/media_plugins/gstreamer010/CMakeLists.txt
+++ b/linden/indra/media_plugins/gstreamer010/CMakeLists.txt
@@ -36,9 +36,15 @@ set(media_plugin_gstreamer010_SOURCE_FILES
36 ) 36 )
37 37
38set(media_plugin_gstreamer010_HEADER_FILES 38set(media_plugin_gstreamer010_HEADER_FILES
39 llmediaimplgstreamer.h
39 llmediaimplgstreamervidplug.h 40 llmediaimplgstreamervidplug.h
40 llmediaimplgstreamertriviallogging.h 41 llmediaimplgstreamertriviallogging.h
41 ) 42 )
43
44set_source_files_properties(${media_plugin_gstreamer010_HEADER_FILES}
45 PROPERTIES HEADER_FILE_ONLY TRUE)
46
47list(APPEND media_plugin_gstreamer010_SOURCE_FILES ${media_plugin_gstreamer010_HEADER_FILES})
42 48
43add_library(media_plugin_gstreamer010 49add_library(media_plugin_gstreamer010
44 SHARED 50 SHARED
diff --git a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
index bb90aa1..7917232 100755
--- a/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
+++ b/linden/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -41,7 +41,7 @@
41///////////////////////////////////////////////////////////////////////// 41/////////////////////////////////////////////////////////////////////////
42// Debug/Info/Warning macros. 42// Debug/Info/Warning macros.
43#if LL_WINDOWS 43#if LL_WINDOWS
44#include <process.h> 44#include <windows.h>
45#define LL_GETPID GetCurrentProcessId 45#define LL_GETPID GetCurrentProcessId
46#else 46#else
47#include <sys/types.h> 47#include <sys/types.h>
diff --git a/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index 3637f6b..6a44887 100755
--- a/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/linden/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -83,6 +83,9 @@ public:
83 gboolean processGSTEvents(GstBus *bus, 83 gboolean processGSTEvents(GstBus *bus,
84 GstMessage *message); 84 GstMessage *message);
85 85
86 // basic log file writing
87 static bool writeToLog(char* str, ...);
88
86private: 89private:
87 std::string getVersion(); 90 std::string getVersion();
88 bool navigateTo( const std::string urlIn ); 91 bool navigateTo( const std::string urlIn );
@@ -178,8 +181,7 @@ MediaPluginGStreamer010::MediaPluginGStreamer010(
178 mVideoSink ( NULL ), 181 mVideoSink ( NULL ),
179 mCommand ( COMMAND_NONE ) 182 mCommand ( COMMAND_NONE )
180{ 183{
181 std::ostringstream str; 184 writeToLog("MediaPluginGStreamer010 PID=%u", U32(LL_GETPID()));
182 INFOMSG("MediaPluginGStreamer010 constructor - my PID=%u", U32(LL_GETPID()));
183} 185}
184 186
185/////////////////////////////////////////////////////////////////////////////// 187///////////////////////////////////////////////////////////////////////////////
@@ -199,6 +201,29 @@ static char* get_gst_state_name(GstState state)
199} 201}
200#endif // LL_GST_REPORT_STATE_CHANGES 202#endif // LL_GST_REPORT_STATE_CHANGES
201 203
204// static
205bool MediaPluginGStreamer010::writeToLog(char* str, ...)
206{
207 LLFILE* fp = LLFile::fopen("media_plugin_gstreamer010.log", "a");
208
209 if (!fp)
210 {
211 return false;
212 }
213
214 time_t timeptr = time(NULL);
215 struct tm* ltime = localtime(&timeptr);
216 fprintf(fp, "[%d:%d:%d] ", ltime->tm_hour, ltime->tm_min, ltime->tm_sec);
217 va_list arglist;
218 va_start(arglist, str);
219 vfprintf(fp, str, arglist);
220 va_end(arglist);
221 fprintf(fp, " \n");
222 fclose(fp);
223
224 return true;
225}
226
202gboolean 227gboolean
203MediaPluginGStreamer010::processGSTEvents(GstBus *bus, 228MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
204 GstMessage *message) 229 GstMessage *message)
@@ -206,17 +231,12 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
206 if (!message) 231 if (!message)
207 return TRUE; // shield against GStreamer bug 232 return TRUE; // shield against GStreamer bug
208 233
234 // TODO: grok 'duration' message type
209 if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_STATE_CHANGED && 235 if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_STATE_CHANGED &&
210 GST_MESSAGE_TYPE(message) != GST_MESSAGE_BUFFERING) 236 GST_MESSAGE_TYPE(message) != GST_MESSAGE_BUFFERING &&
237 GST_MESSAGE_TYPE(message) != GST_MESSAGE_TAG)
211 { 238 {
212 DEBUGMSG("Got GST message type: %s", 239 writeToLog("Got GST message type: %s", GST_MESSAGE_TYPE_NAME (message));
213 GST_MESSAGE_TYPE_NAME (message));
214 }
215 else
216 {
217 // TODO: grok 'duration' message type
218 DEBUGMSG("Got GST message type: %s",
219 GST_MESSAGE_TYPE_NAME (message));
220 } 240 }
221 241
222 switch (GST_MESSAGE_TYPE (message)) 242 switch (GST_MESSAGE_TYPE (message))
@@ -226,7 +246,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
226 // NEEDS GST 0.10.11+ and America discovered by C.Columbus 246 // NEEDS GST 0.10.11+ and America discovered by C.Columbus
227 gint percent = 0; 247 gint percent = 0;
228 gst_message_parse_buffering(message, &percent); 248 gst_message_parse_buffering(message, &percent);
229 DEBUGMSG("GST buffering: %d%%", percent); 249 writeToLog("GST buffering: %d%%", percent);
230 250
231 break; 251 break;
232 } 252 }
@@ -240,7 +260,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
240 &pending_state); 260 &pending_state);
241 #ifdef LL_GST_REPORT_STATE_CHANGES 261 #ifdef LL_GST_REPORT_STATE_CHANGES
242 // not generally very useful, and rather spammy. 262 // not generally very useful, and rather spammy.
243 DEBUGMSG("state change (old,<new>,pending): %s,<%s>,%s", 263 writeToLog("state change (old,<new>,pending): %s,<%s>,%s",
244 get_gst_state_name(old_state), 264 get_gst_state_name(old_state),
245 get_gst_state_name(new_state), 265 get_gst_state_name(new_state),
246 get_gst_state_name(pending_state)); 266 get_gst_state_name(pending_state));
@@ -270,7 +290,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
270 gchar *debug = NULL; 290 gchar *debug = NULL;
271 291
272 gst_message_parse_error (message, &err, &debug); 292 gst_message_parse_error (message, &err, &debug);
273 WARNMSG("GST error: %s", err?err->message:"(unknown)"); 293 writeToLog("GST error: %s", err?err->message:"(unknown)");
274 if (err) 294 if (err)
275 g_error_free (err); 295 g_error_free (err);
276 g_free (debug); 296 g_free (debug);
@@ -287,7 +307,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
287 gchar *debug = NULL; 307 gchar *debug = NULL;
288 308
289 gst_message_parse_info (message, &err, &debug); 309 gst_message_parse_info (message, &err, &debug);
290 INFOMSG("GST info: %s", err?err->message:"(unknown)"); 310 writeToLog("GST info: %s", err?err->message:"(unknown)");
291 if (err) 311 if (err)
292 g_error_free (err); 312 g_error_free (err);
293 g_free (debug); 313 g_free (debug);
@@ -300,7 +320,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
300 gchar *debug = NULL; 320 gchar *debug = NULL;
301 321
302 gst_message_parse_warning (message, &err, &debug); 322 gst_message_parse_warning (message, &err, &debug);
303 WARNMSG("GST warning: %s", err?err->message:"(unknown)"); 323 writeToLog("GST warning: %s", err?err->message:"(unknown)");
304 if (err) 324 if (err)
305 g_error_free (err); 325 g_error_free (err);
306 g_free (debug); 326 g_free (debug);
@@ -317,7 +337,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
317 337
318 if ( gst_tag_list_get_string(new_tags, GST_TAG_TITLE, &title) ) 338 if ( gst_tag_list_get_string(new_tags, GST_TAG_TITLE, &title) )
319 { 339 {
320 //WARMING("Title: %s", title); 340 //writeToLog("Title: %s", title);
321 std::string newtitle(title); 341 std::string newtitle(title);
322 gst_tag_list_free(new_tags); 342 gst_tag_list_free(new_tags);
323 343
@@ -336,10 +356,10 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
336 case GST_MESSAGE_EOS: 356 case GST_MESSAGE_EOS:
337 { 357 {
338 /* end-of-stream */ 358 /* end-of-stream */
339 DEBUGMSG("GST end-of-stream."); 359 writeToLog("GST end-of-stream.");
340 if (mIsLooping) 360 if (mIsLooping)
341 { 361 {
342 DEBUGMSG("looping media..."); 362 //writeToLog("looping media...");
343 double eos_pos_sec = 0.0F; 363 double eos_pos_sec = 0.0F;
344 bool got_eos_position = getTimePos(eos_pos_sec); 364 bool got_eos_position = getTimePos(eos_pos_sec);
345 365
@@ -348,7 +368,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
348 // if we know that the movie is really short, don't 368 // if we know that the movie is really short, don't
349 // loop it else it can easily become a time-hog 369 // loop it else it can easily become a time-hog
350 // because of GStreamer spin-up overhead 370 // because of GStreamer spin-up overhead
351 DEBUGMSG("really short movie (%0.3fsec) - not gonna loop this, pausing instead.", eos_pos_sec); 371 writeToLog("really short movie (%0.3fsec) - not gonna loop this, pausing instead.", eos_pos_sec);
352 // inject a COMMAND_PAUSE 372 // inject a COMMAND_PAUSE
353 mCommand = COMMAND_PAUSE; 373 mCommand = COMMAND_PAUSE;
354 } 374 }
@@ -367,7 +387,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
367 else 387 else
368 #endif // LLGST_LOOP_BY_SEEKING 388 #endif // LLGST_LOOP_BY_SEEKING
369 { // use clumsy stop-start to loop 389 { // use clumsy stop-start to loop
370 DEBUGMSG("didn't loop by rewinding - stopping and starting instead..."); 390 writeToLog("didn't loop by rewinding - stopping and starting instead...");
371 stop(); 391 stop();
372 play(1.0); 392 play(1.0);
373 } 393 }
@@ -413,7 +433,7 @@ MediaPluginGStreamer010::navigateTo ( const std::string urlIn )
413 433
414 setStatus(STATUS_LOADING); 434 setStatus(STATUS_LOADING);
415 435
416 DEBUGMSG("Setting media URI: %s", urlIn.c_str()); 436 writeToLog("Setting media URI: %s", urlIn.c_str());
417 437
418 mSeekWanted = false; 438 mSeekWanted = false;
419 439
@@ -441,13 +461,13 @@ MediaPluginGStreamer010::update(int milliseconds)
441 if (!mDoneInit) 461 if (!mDoneInit)
442 return false; // error 462 return false; // error
443 463
444 DEBUGMSG("updating media..."); 464 //writeToLog("updating media...");
445 465
446 // sanity check 466 // sanity check
447 if (NULL == mPump || 467 if (NULL == mPump ||
448 NULL == mPlaybin) 468 NULL == mPlaybin)
449 { 469 {
450 DEBUGMSG("dead media..."); 470 writeToLog("dead media...");
451 return false; 471 return false;
452 } 472 }
453 473
@@ -477,7 +497,7 @@ MediaPluginGStreamer010::update(int milliseconds)
477 GST_OBJECT_LOCK(mVideoSink); 497 GST_OBJECT_LOCK(mVideoSink);
478 if (mVideoSink->retained_frame_ready) 498 if (mVideoSink->retained_frame_ready)
479 { 499 {
480 DEBUGMSG("NEW FRAME READY"); 500 writeToLog("NEW FRAME READY");
481 501
482 if (mVideoSink->retained_frame_width != mCurrentWidth || 502 if (mVideoSink->retained_frame_width != mCurrentWidth ||
483 mVideoSink->retained_frame_height != mCurrentHeight) 503 mVideoSink->retained_frame_height != mCurrentHeight)
@@ -508,7 +528,7 @@ MediaPluginGStreamer010::update(int milliseconds)
508 GST_OBJECT_UNLOCK(mVideoSink); 528 GST_OBJECT_UNLOCK(mVideoSink);
509 529
510 mCurrentRowbytes = neww * newd; 530 mCurrentRowbytes = neww * newd;
511 DEBUGMSG("video container resized to %dx%d", 531 writeToLog("video container resized to %dx%d",
512 neww, newh); 532 neww, newh);
513 533
514 mDepth = newd; 534 mDepth = newd;
@@ -536,7 +556,7 @@ MediaPluginGStreamer010::update(int milliseconds)
536 } 556 }
537 557
538 GST_OBJECT_UNLOCK(mVideoSink); 558 GST_OBJECT_UNLOCK(mVideoSink);
539 DEBUGMSG("NEW FRAME REALLY TRULY CONSUMED, TELLING HOST"); 559 writeToLog("NEW FRAME REALLY TRULY CONSUMED, TELLING HOST");
540 560
541 setDirty(0,0,mCurrentWidth,mCurrentHeight); 561 setDirty(0,0,mCurrentWidth,mCurrentHeight);
542 } 562 }
@@ -547,7 +567,7 @@ MediaPluginGStreamer010::update(int milliseconds)
547 567
548 GST_OBJECT_UNLOCK(mVideoSink); 568 GST_OBJECT_UNLOCK(mVideoSink);
549 569
550 DEBUGMSG("NEW FRAME not consumed, still waiting for a shm segment and/or shm resize"); 570 writeToLog("NEW FRAME not consumed, still waiting for a shm segment and/or shm resize");
551 } 571 }
552 572
553 return true; 573 return true;
@@ -586,7 +606,7 @@ MediaPluginGStreamer010::mouseMove( int x, int y )
586bool 606bool
587MediaPluginGStreamer010::pause() 607MediaPluginGStreamer010::pause()
588{ 608{
589 DEBUGMSG("pausing media..."); 609 writeToLog("pausing media...");
590 // todo: error-check this? 610 // todo: error-check this?
591 gst_element_set_state(mPlaybin, GST_STATE_PAUSED); 611 gst_element_set_state(mPlaybin, GST_STATE_PAUSED);
592 return true; 612 return true;
@@ -595,7 +615,7 @@ MediaPluginGStreamer010::pause()
595bool 615bool
596MediaPluginGStreamer010::stop() 616MediaPluginGStreamer010::stop()
597{ 617{
598 DEBUGMSG("stopping media..."); 618 writeToLog("stopping media...");
599 // todo: error-check this? 619 // todo: error-check this?
600 gst_element_set_state(mPlaybin, GST_STATE_READY); 620 gst_element_set_state(mPlaybin, GST_STATE_READY);
601 return true; 621 return true;
@@ -605,8 +625,7 @@ bool
605MediaPluginGStreamer010::play(double rate) 625MediaPluginGStreamer010::play(double rate)
606{ 626{
607 // NOTE: we don't actually support non-natural rate. 627 // NOTE: we don't actually support non-natural rate.
608 628 writeToLog("playing media... rate=%f", rate);
609 DEBUGMSG("playing media... rate=%f", rate);
610 // todo: error-check this? 629 // todo: error-check this?
611 gst_element_set_state(mPlaybin, GST_STATE_PLAYING); 630 gst_element_set_state(mPlaybin, GST_STATE_PLAYING);
612 return true; 631 return true;
@@ -643,7 +662,7 @@ MediaPluginGStreamer010::seek(double time_sec)
643 GST_SEEK_TYPE_SET, gint64(time_sec*GST_SECOND), 662 GST_SEEK_TYPE_SET, gint64(time_sec*GST_SECOND),
644 GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); 663 GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
645 } 664 }
646 DEBUGMSG("MEDIA SEEK REQUEST to %fsec result was %d", 665 writeToLog("MEDIA SEEK REQUEST to %f sec result was %d",
647 float(time_sec), int(success)); 666 float(time_sec), int(success));
648 return success; 667 return success;
649} 668}
@@ -697,7 +716,7 @@ MediaPluginGStreamer010::load()
697 716
698 setStatus(STATUS_LOADING); 717 setStatus(STATUS_LOADING);
699 718
700 DEBUGMSG("setting up media..."); 719 writeToLog("setting up media...");
701 720
702 mIsLooping = false; 721 mIsLooping = false;
703 mVolume = (float) 0.1234567; // minor hack to force an initial volume update 722 mVolume = (float) 0.1234567; // minor hack to force an initial volume update
@@ -736,7 +755,7 @@ MediaPluginGStreamer010::load()
736 GST_SLVIDEO(gst_element_factory_make ("private-slvideo", "slvideo")); 755 GST_SLVIDEO(gst_element_factory_make ("private-slvideo", "slvideo"));
737 if (!mVideoSink) 756 if (!mVideoSink)
738 { 757 {
739 WARNMSG("Could not instantiate private-slvideo element."); 758 writeToLog("Could not instantiate private-slvideo element.");
740 // todo: cleanup. 759 // todo: cleanup.
741 setStatus(STATUS_ERROR); 760 setStatus(STATUS_ERROR);
742 return false; // error 761 return false; // error
@@ -755,7 +774,7 @@ MediaPluginGStreamer010::unload ()
755 if (!mDoneInit) 774 if (!mDoneInit)
756 return false; // error 775 return false; // error
757 776
758 DEBUGMSG("unloading media..."); 777 writeToLog("unloading media...");
759 778
760 // stop getting callbacks for this bus 779 // stop getting callbacks for this bus
761 g_source_remove(mBusWatchID); 780 g_source_remove(mBusWatchID);
@@ -813,7 +832,7 @@ MediaPluginGStreamer010::startup()
813 "libgstvideo-0.10.so.0") ) 832 "libgstvideo-0.10.so.0") )
814#endif 833#endif
815 { 834 {
816 WARNMSG("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled."); 835 writeToLog("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled.");
817 return false; 836 return false;
818 } 837 }
819*/ 838*/
@@ -823,7 +842,7 @@ MediaPluginGStreamer010::startup()
823// } 842// }
824// else 843// else
825// { 844// {
826// WARNMSG("gst_segtrap_set_enabled() is not available; plugin crashes won't be caught."); 845// writeToLog("gst_segtrap_set_enabled() is not available; plugin crashes won't be caught.");
827// } 846// }
828/* 847/*
829#if LL_LINUX 848#if LL_LINUX
@@ -866,12 +885,12 @@ MediaPluginGStreamer010::startup()
866 { 885 {
867 if (err) 886 if (err)
868 { 887 {
869 WARNMSG("GST init failed: %s", err->message); 888 writeToLog("GST init failed: %s", err->message);
870 g_error_free(err); 889 g_error_free(err);
871 } 890 }
872 else 891 else
873 { 892 {
874 WARNMSG("GST init failed for unspecified reason."); 893 writeToLog("GST init failed for unspecified reason.");
875 } 894 }
876 return false; 895 return false;
877 } 896 }
@@ -882,22 +901,22 @@ MediaPluginGStreamer010::startup()
882 901
883 // Init our custom plugins - only really need do this once. 902 // Init our custom plugins - only really need do this once.
884 gst_slvideo_init_class(); 903 gst_slvideo_init_class();
885/* 904
886 // List the plugins GStreamer can find 905 // List the plugins GStreamer can find
887 LL_DEBUGS("MediaImpl") << "Found GStreamer plugins:" << LL_ENDL; 906 writeToLog("Found GStreamer plugins:");
888 GList *list; 907 GList *list;
889 GstRegistry *registry = gst_registry_get_default(); 908 GstRegistry *registry = gst_registry_get_default();
890 std::string loaded = ""; 909 std::string loaded = "No";
891 for (list = gst_registry_get_plugin_list(registry); 910 for (list = gst_registry_get_plugin_list(registry);
892 list != NULL; 911 list != NULL;
893 list = g_list_next(list)) 912 list = g_list_next(list))
894 { 913 {
895 GstPlugin *list_plugin = (GstPlugin *)list->data; 914 GstPlugin *list_plugin = (GstPlugin *)list->data;
896 (bool)gst_plugin_is_loaded(list_plugin) ? loaded = "Yes" : loaded = "No"; 915 if (gst_plugin_is_loaded(list_plugin)) loaded = "Yes";
897 LL_DEBUGS("MediaImpl") << gst_plugin_get_name(list_plugin) << ", loaded? " << loaded << LL_ENDL; 916 writeToLog("%s, loaded? %s", gst_plugin_get_name(list_plugin), loaded.c_str());
898 } 917 }
899 gst_plugin_list_free(list); 918 gst_plugin_list_free(list);
900*/ 919
901 mDoneInit = true; 920 mDoneInit = true;
902 } 921 }
903 922
@@ -941,11 +960,11 @@ void MediaPluginGStreamer010::set_gst_plugin_path()
941 960
942 if( imp_dir == "" ) 961 if( imp_dir == "" )
943 { 962 {
944 WARNMSG("Could not get application directory, not setting GST_PLUGIN_PATH."); 963 writeToLog("Could not get application directory, not setting GST_PLUGIN_PATH.");
945 return; 964 return;
946 } 965 }
947 966
948 DEBUGMSG("meta-impy is installed at %s", imp_dir); 967 writeToLog("meta-impy is installed at %s", imp_dir.c_str());
949 968
950 // ":" on Mac and 'Nix, ";" on Windows 969 // ":" on Mac and 'Nix, ";" on Windows
951 std::string separator = G_SEARCHPATH_SEPARATOR_S; 970 std::string separator = G_SEARCHPATH_SEPARATOR_S;
@@ -955,7 +974,7 @@ void MediaPluginGStreamer010::set_gst_plugin_path()
955 char *old_path = getenv("GST_PLUGIN_PATH"); 974 char *old_path = getenv("GST_PLUGIN_PATH");
956 if(old_path == NULL) 975 if(old_path == NULL)
957 { 976 {
958 DEBUGMSG("Did not find user-set GST_PLUGIN_PATH."); 977 writeToLog("Did not find user-set GST_PLUGIN_PATH.");
959 } 978 }
960 else 979 else
961 { 980 {
@@ -986,11 +1005,11 @@ void MediaPluginGStreamer010::set_gst_plugin_path()
986 1005
987 if( put_result == -1 ) 1006 if( put_result == -1 )
988 { 1007 {
989 WARNMSG("Setting GST_PLUGIN_PATH failed!"); 1008 writeToLog("Setting GST_PLUGIN_PATH failed!");
990 } 1009 }
991 else 1010 else
992 { 1011 {
993 DEBUGMSG("GST_PLUGIN_PATH set to %s", getenv("GST_PLUGIN_PATH")); 1012 writeToLog("GST_PLUGIN_PATH set to %s", getenv("GST_PLUGIN_PATH"));
994 } 1013 }
995 1014
996 // Don't load system plugins. We only want to use ours, to avoid conflicts. 1015 // Don't load system plugins. We only want to use ours, to avoid conflicts.
@@ -1002,7 +1021,7 @@ void MediaPluginGStreamer010::set_gst_plugin_path()
1002 1021
1003 if( put_result == -1 ) 1022 if( put_result == -1 )
1004 { 1023 {
1005 WARNMSG("Setting GST_PLUGIN_SYSTEM_PATH=\"\" failed!"); 1024 writeToLog("Setting GST_PLUGIN_SYSTEM_PATH=\"\" failed!");
1006 } 1025 }
1007 1026
1008#endif // LL_WINDOWS || LL_DARWIN 1027#endif // LL_WINDOWS || LL_DARWIN
@@ -1020,7 +1039,7 @@ MediaPluginGStreamer010::sizeChanged()
1020 { 1039 {
1021 mNaturalWidth = mCurrentWidth; 1040 mNaturalWidth = mCurrentWidth;
1022 mNaturalHeight = mCurrentHeight; 1041 mNaturalHeight = mCurrentHeight;
1023 DEBUGMSG("Media NATURAL size better detected as %dx%d", 1042 writeToLog("Media NATURAL size better detected as %dx%d",
1024 mNaturalWidth, mNaturalHeight); 1043 mNaturalWidth, mNaturalHeight);
1025 } 1044 }
1026 1045
@@ -1035,7 +1054,7 @@ MediaPluginGStreamer010::sizeChanged()
1035 message.setValue("name", mTextureSegmentName); 1054 message.setValue("name", mTextureSegmentName);
1036 message.setValueS32("width", mNaturalWidth); 1055 message.setValueS32("width", mNaturalWidth);
1037 message.setValueS32("height", mNaturalHeight); 1056 message.setValueS32("height", mNaturalHeight);
1038 DEBUGMSG("<--- Sending size change request to application with name: '%s' - natural size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight); 1057 writeToLog("<--- Sending size change request to application with name: '%s' - natural size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
1039 sendMessage(message); 1058 sendMessage(message);
1040 } 1059 }
1041} 1060}
@@ -1058,11 +1077,11 @@ MediaPluginGStreamer010::closedown()
1058 1077
1059MediaPluginGStreamer010::~MediaPluginGStreamer010() 1078MediaPluginGStreamer010::~MediaPluginGStreamer010()
1060{ 1079{
1061 DEBUGMSG("MediaPluginGStreamer010 destructor"); 1080 //writeToLog("MediaPluginGStreamer010 destructor");
1062 1081
1063 closedown(); 1082 closedown();
1064 1083
1065 DEBUGMSG("GStreamer010 closing down"); 1084 writeToLog("GStreamer010 closing down");
1066} 1085}
1067 1086
1068 1087
@@ -1085,7 +1104,7 @@ MediaPluginGStreamer010::getVersion()
1085 1104
1086void MediaPluginGStreamer010::receiveMessage(const char *message_string) 1105void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1087{ 1106{
1088 //std::cerr << "MediaPluginGStreamer010::receiveMessage: received message: \"" << message_string << "\"" << std::endl; 1107 //std::cerr << "MediaPluginGStreamer010::receiveMessage: received message: \"" << message_string << "\"";
1089 1108
1090 LLPluginMessage message_in; 1109 LLPluginMessage message_in;
1091 1110
@@ -1106,11 +1125,11 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1106 1125
1107 if ( load() ) 1126 if ( load() )
1108 { 1127 {
1109 DEBUGMSG("GStreamer010 media instance set up"); 1128 writeToLog("GStreamer010 media instance set up");
1110 } 1129 }
1111 else 1130 else
1112 { 1131 {
1113 WARNMSG("GStreamer010 media instance failed to set up"); 1132 writeToLog("GStreamer010 media instance failed to set up");
1114 } 1133 }
1115 1134
1116 message.setValue("plugin_version", getVersion()); 1135 message.setValue("plugin_version", getVersion());
@@ -1137,7 +1156,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1137 std::string name = message_in.getValue("name"); 1156 std::string name = message_in.getValue("name");
1138 1157
1139 std::ostringstream str; 1158 std::ostringstream str;
1140 INFOMSG("MediaPluginGStreamer010::receiveMessage: shared memory added, name: %s, size: %d, address: %p", name.c_str(), int(info.mSize), info.mAddress); 1159 writeToLog("MediaPluginGStreamer010::receiveMessage: shared memory added, name: %s, size: %d, address: %p", name.c_str(), int(info.mSize), info.mAddress);
1141 1160
1142 mSharedSegments.insert(SharedSegmentMap::value_type(name, info)); 1161 mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
1143 } 1162 }
@@ -1145,7 +1164,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1145 { 1164 {
1146 std::string name = message_in.getValue("name"); 1165 std::string name = message_in.getValue("name");
1147 1166
1148 DEBUGMSG("MediaPluginGStreamer010::receiveMessage: shared memory remove, name = %s", name.c_str()); 1167 writeToLog("MediaPluginGStreamer010::receiveMessage: shared memory remove, name = %s", name.c_str());
1149 1168
1150 SharedSegmentMap::iterator iter = mSharedSegments.find(name); 1169 SharedSegmentMap::iterator iter = mSharedSegments.find(name);
1151 if(iter != mSharedSegments.end()) 1170 if(iter != mSharedSegments.end())
@@ -1163,7 +1182,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1163 } 1182 }
1164 else 1183 else
1165 { 1184 {
1166 WARNMSG("MediaPluginGStreamer010::receiveMessage: unknown shared memory region!"); 1185 writeToLog("MediaPluginGStreamer010::receiveMessage: unknown shared memory region!");
1167 } 1186 }
1168 1187
1169 // Send the response so it can be cleaned up. 1188 // Send the response so it can be cleaned up.
@@ -1174,7 +1193,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1174 else 1193 else
1175 { 1194 {
1176 std::ostringstream str; 1195 std::ostringstream str;
1177 INFOMSG("MediaPluginGStreamer010::receiveMessage: unknown base message: %s", message_name.c_str()); 1196 writeToLog("MediaPluginGStreamer010::receiveMessage: unknown base message: %s", message_name.c_str());
1178 } 1197 }
1179 } 1198 }
1180 else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) 1199 else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
@@ -1217,7 +1236,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1217 S32 texture_height = message_in.getValueS32("texture_height"); 1236 S32 texture_height = message_in.getValueS32("texture_height");
1218 1237
1219 std::ostringstream str; 1238 std::ostringstream str;
1220 INFOMSG("---->Got size change instruction from application with shm name: %s - size is %d x %d", name.c_str(), width, height); 1239 writeToLog("---->Got size change instruction from application with shm name: %s - size is %d x %d", name.c_str(), width, height);
1221 1240
1222 LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response"); 1241 LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
1223 message.setValue("name", name); 1242 message.setValue("name", name);
@@ -1233,8 +1252,8 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1233 SharedSegmentMap::iterator iter = mSharedSegments.find(name); 1252 SharedSegmentMap::iterator iter = mSharedSegments.find(name);
1234 if(iter != mSharedSegments.end()) 1253 if(iter != mSharedSegments.end())
1235 { 1254 {
1236 INFOMSG("*** Got size change with matching shm, new size is %d x %d", width, height); 1255 writeToLog("*** Got size change with matching shm, new size is %d x %d", width, height);
1237 INFOMSG("*** Got size change with matching shm, texture size size is %d x %d", texture_width, texture_height); 1256 writeToLog("*** Got size change with matching shm, texture size size is %d x %d", texture_width, texture_height);
1238 1257
1239 mPixels = (unsigned char*)iter->second.mAddress; 1258 mPixels = (unsigned char*)iter->second.mAddress;
1240 mTextureSegmentName = name; 1259 mTextureSegmentName = name;
@@ -1244,7 +1263,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1244 if (texture_width > 1 || 1263 if (texture_width > 1 ||
1245 texture_height > 1) // not a dummy size from the app, a real explicit forced size 1264 texture_height > 1) // not a dummy size from the app, a real explicit forced size
1246 { 1265 {
1247 INFOMSG("**** = REAL RESIZE REQUEST FROM APP"); 1266 writeToLog("**** = REAL RESIZE REQUEST FROM APP");
1248 1267
1249 GST_OBJECT_LOCK(mVideoSink); 1268 GST_OBJECT_LOCK(mVideoSink);
1250 mVideoSink->resize_forced_always = true; 1269 mVideoSink->resize_forced_always = true;
@@ -1326,13 +1345,23 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
1326 } 1345 }
1327 else 1346 else
1328 { 1347 {
1329 INFOMSG("MediaPluginGStreamer010::receiveMessage: unknown message class: %s", message_class.c_str()); 1348 writeToLog("MediaPluginGStreamer010::receiveMessage: unknown message class: %s", message_class.c_str());
1330 } 1349 }
1331 } 1350 }
1332} 1351}
1333 1352
1334int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data) 1353int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
1335{ 1354{
1355 // init log file
1356 LLFILE* fp = LLFile::fopen("media_plugin_gstreamer010.log", "w");
1357 if (fp)
1358 {
1359 time_t timeptr = time(NULL);
1360 fprintf(fp, "%s", asctime(localtime(&timeptr)));
1361 fprintf(fp, "<--- Begin media_plugin_gstreamer010 initialization --->\n");
1362 fclose(fp);
1363 }
1364
1336 if (MediaPluginGStreamer010::startup()) 1365 if (MediaPluginGStreamer010::startup())
1337 { 1366 {
1338 MediaPluginGStreamer010 *self = new MediaPluginGStreamer010(host_send_func, host_user_data); 1367 MediaPluginGStreamer010 *self = new MediaPluginGStreamer010(host_send_func, host_user_data);
diff --git a/linden/indra/media_plugins/webkit/linux_volume_catcher.cpp b/linden/indra/media_plugins/webkit/linux_volume_catcher.cpp
index c4c4181..cc3836e 100644
--- a/linden/indra/media_plugins/webkit/linux_volume_catcher.cpp
+++ b/linden/indra/media_plugins/webkit/linux_volume_catcher.cpp
@@ -58,7 +58,7 @@ extern "C" {
58#include <pulse/subscribe.h> 58#include <pulse/subscribe.h>
59#include <pulse/glib-mainloop.h> // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken. 59#include <pulse/glib-mainloop.h> // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken.
60 60
61#include "apr_pools.h" 61#include "aiaprpool.h"
62#include "apr_dso.h" 62#include "apr_dso.h"
63} 63}
64 64
@@ -74,7 +74,7 @@ extern "C" {
74#undef LL_PA_SYM 74#undef LL_PA_SYM
75 75
76static bool sSymsGrabbed = false; 76static bool sSymsGrabbed = false;
77static apr_pool_t *sSymPADSOMemoryPool = NULL; 77static AIAPRPool sSymPADSOMemoryPool;
78static apr_dso_handle_t *sSymPADSOHandleG = NULL; 78static apr_dso_handle_t *sSymPADSOHandleG = NULL;
79 79
80bool grab_pa_syms(std::string pulse_dso_name) 80bool grab_pa_syms(std::string pulse_dso_name)
@@ -93,11 +93,11 @@ bool grab_pa_syms(std::string pulse_dso_name)
93#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0) 93#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0)
94 94
95 //attempt to load the shared library 95 //attempt to load the shared library
96 apr_pool_create(&sSymPADSOMemoryPool, NULL); 96 sSymPADSOMemoryPool.create();
97 97
98 if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle, 98 if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle,
99 pulse_dso_name.c_str(), 99 pulse_dso_name.c_str(),
100 sSymPADSOMemoryPool) )) 100 sSymPADSOMemoryPool()) ))
101 { 101 {
102 INFOMSG("Found DSO: %s", pulse_dso_name.c_str()); 102 INFOMSG("Found DSO: %s", pulse_dso_name.c_str());
103 103
@@ -140,11 +140,7 @@ void ungrab_pa_syms()
140 sSymPADSOHandleG = NULL; 140 sSymPADSOHandleG = NULL;
141 } 141 }
142 142
143 if ( sSymPADSOMemoryPool ) 143 sSymPADSOMemoryPool.destroy();
144 {
145 apr_pool_destroy(sSymPADSOMemoryPool);
146 sSymPADSOMemoryPool = NULL;
147 }
148 144
149 // NULL-out all of the symbols we'd grabbed 145 // NULL-out all of the symbols we'd grabbed
150#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0) 146#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0)
diff --git a/linden/indra/media_plugins/webkit/windows_volume_catcher.cpp b/linden/indra/media_plugins/webkit/windows_volume_catcher.cpp
index f1afea7..64f70c4 100644
--- a/linden/indra/media_plugins/webkit/windows_volume_catcher.cpp
+++ b/linden/indra/media_plugins/webkit/windows_volume_catcher.cpp
@@ -34,6 +34,8 @@
34 */ 34 */
35 35
36#include "volume_catcher.h" 36#include "volume_catcher.h"
37# define WIN32_LEAN_AND_MEAN
38# include <winsock2.h>
37#include <windows.h> 39#include <windows.h>
38#include "llmemory.h" 40#include "llmemory.h"
39class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl> 41class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index c7d46c2..ff11a7f 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -87,6 +87,7 @@ set(viewer_SOURCE_FILES
87 impprefsfonts.cpp 87 impprefsfonts.cpp
88 jcfloater_animation_list.cpp 88 jcfloater_animation_list.cpp
89 jcfloaterareasearch.cpp 89 jcfloaterareasearch.cpp
90 kokuastreamingaudio.cpp
90 kowopenregionsettings.cpp 91 kowopenregionsettings.cpp
91 lightshare.cpp 92 lightshare.cpp
92 llagent.cpp 93 llagent.cpp
@@ -171,6 +172,7 @@ set(viewer_SOURCE_FILES
171 llfloatercustomize.cpp 172 llfloatercustomize.cpp
172 llfloaterdaycycle.cpp 173 llfloaterdaycycle.cpp
173 llfloaterdirectory.cpp 174 llfloaterdirectory.cpp
175 llfloaterdisplayname.cpp
174 llfloatereditui.cpp 176 llfloatereditui.cpp
175 llfloaterenvsettings.cpp 177 llfloaterenvsettings.cpp
176 llfloaterevent.cpp 178 llfloaterevent.cpp
@@ -408,6 +410,7 @@ set(viewer_SOURCE_FILES
408 llviewercamera.cpp 410 llviewercamera.cpp
409 llviewercontrol.cpp 411 llviewercontrol.cpp
410 llviewerdisplay.cpp 412 llviewerdisplay.cpp
413 llviewerdisplayname.cpp
411 llviewergenericmessage.cpp 414 llviewergenericmessage.cpp
412 llviewergesture.cpp 415 llviewergesture.cpp
413 llviewerimage.cpp 416 llviewerimage.cpp
@@ -540,6 +543,7 @@ set(viewer_HEADER_FILES
540 impprefsfonts.h 543 impprefsfonts.h
541 jcfloater_animation_list.h 544 jcfloater_animation_list.h
542 jcfloaterareasearch.h 545 jcfloaterareasearch.h
546 kokuastreamingaudio.h
543 lightshare.h 547 lightshare.h
544 lggautocorrectfloater.h 548 lggautocorrectfloater.h
545 lggautocorrect.h 549 lggautocorrect.h
@@ -629,6 +633,7 @@ set(viewer_HEADER_FILES
629 llfloatercustomize.h 633 llfloatercustomize.h
630 llfloaterdaycycle.h 634 llfloaterdaycycle.h
631 llfloaterdirectory.h 635 llfloaterdirectory.h
636 llfloaterdisplayname.h
632 llfloatereditui.h 637 llfloatereditui.h
633 llfloaterenvsettings.h 638 llfloaterenvsettings.h
634 llfloaterevent.h 639 llfloaterevent.h
@@ -870,6 +875,7 @@ set(viewer_HEADER_FILES
870 llviewercamera.h 875 llviewercamera.h
871 llviewercontrol.h 876 llviewercontrol.h
872 llviewerdisplay.h 877 llviewerdisplay.h
878 llviewerdisplayname.h
873 llviewergenericmessage.h 879 llviewergenericmessage.h
874 llviewergesture.h 880 llviewergesture.h
875 llviewerimage.h 881 llviewerimage.h
@@ -1366,7 +1372,7 @@ if (WINDOWS)
1366 DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py 1372 DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1367 ) 1373 )
1368 1374
1369 add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) # Removed media_plugin_gstreamer010 1375 add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit media_plugin_gstreamer010)
1370 1376
1371 if (PACKAGE) 1377 if (PACKAGE)
1372 add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat) 1378 add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat)
@@ -1582,17 +1588,17 @@ if (WINDOWS)
1582 COMMENT "Copying WebKit Plugin to the runtime folder." 1588 COMMENT "Copying WebKit Plugin to the runtime folder."
1583 ) 1589 )
1584 1590
1585 #get_target_property(BUILT_GSTREAMER_PLUGIN media_plugin_gstreamer010 LOCATION) 1591 get_target_property(BUILT_GSTREAMER_PLUGIN media_plugin_gstreamer010 LOCATION)
1586 # add_custom_command( 1592 add_custom_command(
1587 # TARGET ${VIEWER_BINARY_NAME} POST_BUILD 1593 TARGET ${VIEWER_BINARY_NAME} POST_BUILD
1588 # COMMAND ${CMAKE_COMMAND} 1594 COMMAND ${CMAKE_COMMAND}
1589 # ARGS 1595 ARGS
1590 # -E 1596 -E
1591 # copy_if_different 1597 copy_if_different
1592 # ${BUILT_GSTREAMER_PLUGIN} 1598 ${BUILT_GSTREAMER_PLUGIN}
1593 # ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin 1599 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
1594 # COMMENT "Copying Gstreamer Plugin to the runtime folder." 1600 COMMENT "Copying Gstreamer Plugin to the runtime folder."
1595 # ) 1601 )
1596 1602
1597 get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION) 1603 get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION)
1598 add_custom_command( 1604 add_custom_command(
diff --git a/linden/indra/newview/app_settings/cloud.xml b/linden/indra/newview/app_settings/cloud.xml
new file mode 100644
index 0000000..ff9492b
--- /dev/null
+++ b/linden/indra/newview/app_settings/cloud.xml
@@ -0,0 +1,88 @@
1<llsd>
2 <map>
3 <key>AngularVelocity</key>
4 <array>
5 <real>0</real>
6 <real>0</real>
7 <real>0</real>
8 </array>
9 <key>BurstPartCount</key>
10 <integer>1</integer>
11 <key>BurstRadius</key>
12 <real>0.3</real>
13 <key>BurstRate</key>
14 <real>0.02</real>
15 <key>BurstSpeedMax</key>
16 <real>1</real>
17 <key>Endcolor</key>
18 <array>
19 <real>0.75</real>
20 <real>0.47</real>
21 <real>0.81</real>
22 <real>0</real>
23 </array>
24 <key>Endscale</key>
25 <array>
26 <real>0.02</real>
27 <real>0.02</real>
28 </array>
29 <key>InnerAngle</key>
30 <real>3.1415927410125732421875</real>
31 <key>LL_PART_BEAM_MASK</key>
32 <integer>0</integer>
33 <key>LL_PART_BOUNCE_MASK</key>
34 <integer>0</integer>
35 <key>LL_PART_EMISSIVE_MASK</key>
36 <integer>1</integer>
37 <key>LL_PART_FOLLOW_SRC_MASK</key>
38 <integer>0</integer>
39 <key>LL_PART_FOLLOW_VELOCITY_MASK</key>
40 <integer>0</integer>
41 <key>LL_PART_INTERP_COLOR_MASK</key>
42 <integer>1</integer>
43 <key>LL_PART_INTERP_SCALE_MASK</key>
44 <integer>1</integer>
45 <key>LL_PART_SRC_PATTERN_ANGLE</key>
46 <integer>0</integer>
47 <key>LL_PART_SRC_PATTERN_ANGLE_CONE</key>
48 <integer>1</integer>
49 <key>LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY</key>
50 <integer>0</integer>
51 <key>LL_PART_SRC_PATTERN_DROP</key>
52 <integer>0</integer>
53 <key>LL_PART_SRC_PATTERN_EXPLODE</key>
54 <integer>0</integer>
55 <key>LL_PART_TARGET_LINEAR_MASK</key>
56 <integer>0</integer>
57 <key>LL_PART_TARGET_POS_MASK</key>
58 <integer>1</integer>
59 <key>LL_PART_WIND_MASK</key>
60 <integer>0</integer>
61 <key>OuterAngle</key>
62 <real>0</real>
63 <key>PartImageID</key>
64 <string>0000000000000-0000-0000-000000000000</string>
65 <key>ParticleMaxAge</key>
66 <real>0</real>
67 <key>ParticleStartAge</key>
68 <real>0</real>
69 <key>SourceMaxage</key>
70 <real>4</real>
71 <key>Startcolor</key>
72 <array>
73 <real>0.9</real>
74 <real>0.0</real>
75 <real>0.8</real>
76 <real>0.7</real>
77 </array>
78 <key>Startscale</key>
79 <array>
80 <real>0.8</real>
81 <real>0.8</real>
82 </array>
83 <key>TargetId</key>
84 <string>00000000-0000-0000-0000-000000000000</string>
85 <key>BurstSpeedMin</key>
86 <real>0.1</real>
87 </map>
88</llsd>
diff --git a/linden/indra/newview/app_settings/logcontrol.xml b/linden/indra/newview/app_settings/logcontrol.xml
index c94fc51..353ae72 100644
--- a/linden/indra/newview/app_settings/logcontrol.xml
+++ b/linden/indra/newview/app_settings/logcontrol.xml
@@ -1,7 +1,7 @@
1<llsd> 1<llsd>
2 <map> 2 <map>
3 <!-- default-level can be ALL, DEBUG, INFO, WARN, ERROR, or NONE --> 3 <!-- default-level can be ALL, DEBUG, INFO, WARN, ERROR, or NONE -->
4 <key>default-level</key> <string>INFO</string> 4 <key>default-level</key> <string>WARN</string>
5 <key>print-location</key> <boolean>false</boolean> 5 <key>print-location</key> <boolean>false</boolean>
6 <key>settings</key> 6 <key>settings</key>
7 <array> 7 <array>
@@ -29,7 +29,7 @@
29 </array> 29 </array>
30 </map> 30 </map>
31 <map> 31 <map>
32 <key>level</key><string>DEBUG</string> 32 <key>level</key><string>WARN</string>
33 <key>functions</key> 33 <key>functions</key>
34 <array> 34 <array>
35 </array> 35 </array>
@@ -66,7 +66,15 @@
66 66
67 <!--<string>Messaging</string>--> 67 <!--<string>Messaging</string>-->
68 <!--<string>Notifications</string>--> 68 <!--<string>Notifications</string>-->
69 <!--<string>Plugin</string>--> 69 <string>Plugin</string>
70 <string>PluginClassMedia</string>
71 <string>PluginInstance</string>
72 <string>PluginPipe</string>
73 <string>PluginChild</string>
74 <!--<string>PluginSpam</string>-->
75 <string>PluginParent</string>
76 <string>PluginViewerMedia</string>
77
70 <!--<string>Radar</string>--> 78 <!--<string>Radar</string>-->
71 <!--<string>ShaderLoading</string>--> 79 <!--<string>ShaderLoading</string>-->
72 80
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 24f4d9a..85574e6 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -419,6 +419,42 @@
419 <key>Value</key> 419 <key>Value</key>
420 <integer>0</integer> 420 <integer>0</integer>
421 </map> 421 </map>
422
423 <!-- Display Names -->
424 <key>DisplayNamesUsage</key>
425 <map>
426 <key>Comment</key>
427 <string>Usage type for display names: 0 = Legacy name only, 1 = display name only (legacy name when absent), 2 = Display name with legacy name</string>
428 <key>Persist</key>
429 <integer>1</integer>
430 <key>Type</key>
431 <string>U32</string>
432 <key>Value</key>
433 <integer>2</integer>
434 </map>
435 <key>OmitResidentAsLastName</key>
436 <map>
437 <key>Comment</key>
438 <string>Do not display "Resident" as the last name for new residents in their legacy name</string>
439 <key>Persist</key>
440 <integer>1</integer>
441 <key>Type</key>
442 <string>Boolean</string>
443 <key>Value</key>
444 <integer>1</integer>
445 </map>
446 <key>LegacyNamesForFriends</key>
447 <map>
448 <key>Comment</key>
449 <string>When TRUE, forces the use of the legacy names for the friends list and online notifications</string>
450 <key>Persist</key>
451 <integer>1</integer>
452 <key>Type</key>
453 <string>Boolean</string>
454 <key>Value</key>
455 <integer>1</integer>
456 </map>
457
422 <key>EmeraldTemporaryUpload</key> 458 <key>EmeraldTemporaryUpload</key>
423 <map> 459 <map>
424 <key>Comment</key> 460 <key>Comment</key>
@@ -1330,6 +1366,17 @@
1330 <key>Value</key> 1366 <key>Value</key>
1331 <integer>1</integer> 1367 <integer>1</integer>
1332 </map> 1368 </map>
1369 <key>WarnFirstPrivacy</key>
1370 <map>
1371 <key>Comment</key>
1372 <string>Enables FirstPrivacy warning on login</string>
1373 <key>Persist</key>
1374 <integer>1</integer>
1375 <key>Type</key>
1376 <string>Boolean</string>
1377 <key>Value</key>
1378 <integer>1</integer>
1379 </map>
1333 <key>WarnFirstVoiceLicense</key> 1380 <key>WarnFirstVoiceLicense</key>
1334 <map> 1381 <map>
1335 <key>Comment</key> 1382 <key>Comment</key>
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index 0593091..b5a7e8c 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -69,7 +69,7 @@
69#include "llviewerparcelmgr.h" 69#include "llviewerparcelmgr.h"
70#include "llviewerparcelmedia.h" 70#include "llviewerparcelmedia.h"
71#include "llparcel.h" 71#include "llparcel.h"
72#include "llaudioengine.h" 72#include "kokuastreamingaudio.h"
73#include "llviewerparcelmediaautoplay.h" 73#include "llviewerparcelmediaautoplay.h"
74#include "lloverlaybar.h" 74#include "lloverlaybar.h"
75#include "lggautocorrectfloater.h" 75#include "lggautocorrectfloater.h"
@@ -367,7 +367,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
367 { 367 {
368 gOverlayBar->toggleMusicPlay(gOverlayBar); 368 gOverlayBar->toggleMusicPlay(gOverlayBar);
369 } 369 }
370 gAudiop->startInternetStream(status); 370 gAudioStream->startInternetStream(status);
371 return false; 371 return false;
372 } 372 }
373 } 373 }
diff --git a/linden/indra/newview/kokuastreamingaudio.cpp b/linden/indra/newview/kokuastreamingaudio.cpp
new file mode 100644
index 0000000..ed606db
--- /dev/null
+++ b/linden/indra/newview/kokuastreamingaudio.cpp
@@ -0,0 +1,129 @@
1 /**
2 * @file kokuastreamingaudio.cpp
3 * @brief Definition of KOKUAStreamingAudio base class for streaming audio support
4 *
5 * $LicenseInfo:firstyear=2011&license=viewergpl$
6 * Kokua Viewer Source Code
7 * Copyright (C) 2011, Armin.Weatherwax (at) googlemail.com
8 * for the Kokua Viewer Team, in special for our Imprudence Viewer.
9 *
10 * The source code in this file ("Source Code") is provided by the author
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in this
13 * distribution, or online at
14 * http://secondlifegrid.net/programs/open_source/licensing/gplv2
15 *
16 * There are special exceptions to the terms and conditions of the GPL as
17 * it is applied to this Source Code. View the full text of the exception
18 * in the file doc/FLOSS-exception.txt in this software distribution, or
19 * online at
20 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * THIS SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 *
30 * $/LicenseInfo$
31 */
32
33#include "kokuastreamingaudio.h"
34#include "llstreamingaudio.h"
35
36
37KOKUAStreamingAudio* gAudioStream = NULL;
38
39KOKUAStreamingAudio::KOKUAStreamingAudio(LLStreamingAudioInterface *impl) :
40mStreamingAudioImpl (impl)
41{
42
43}
44
45KOKUAStreamingAudio::~KOKUAStreamingAudio()
46{
47 if (mStreamingAudioImpl)
48 {
49 delete mStreamingAudioImpl;
50 mStreamingAudioImpl = NULL;
51 }
52}
53
54LLStreamingAudioInterface* KOKUAStreamingAudio::getStreamingAudioImpl()
55{
56 return mStreamingAudioImpl;
57}
58
59// void KOKUAStreamingAudio::setStreamingAudioImpl(LLStreamingAudioInterface *impl)
60// {
61// mStreamingAudioImpl = impl;
62// }
63
64// virtual
65void KOKUAStreamingAudio::startInternetStream(const std::string& url)
66{
67 if (mStreamingAudioImpl)
68 mStreamingAudioImpl->start(url);
69}
70
71// virtual
72void KOKUAStreamingAudio::stopInternetStream()
73{
74 if (mStreamingAudioImpl)
75 mStreamingAudioImpl->stop();
76}
77
78// virtual
79void KOKUAStreamingAudio::pauseInternetStream(int pause)
80{
81 if (mStreamingAudioImpl)
82 mStreamingAudioImpl->pause(pause);
83}
84
85// virtual
86void KOKUAStreamingAudio::updateInternetStream()
87{
88 if (mStreamingAudioImpl)
89 mStreamingAudioImpl->update();
90}
91
92// virtual
93KOKUAStreamingAudio::KOKUAAudioPlayState KOKUAStreamingAudio::isInternetStreamPlaying()
94{
95 if (mStreamingAudioImpl)
96 return (KOKUAStreamingAudio::KOKUAAudioPlayState) mStreamingAudioImpl->isPlaying();
97
98 return KOKUAStreamingAudio::AUDIO_STOPPED; // Stopped
99}
100
101// virtual
102void KOKUAStreamingAudio::setInternetStreamGain(F32 vol)
103{
104 if (mStreamingAudioImpl)
105 mStreamingAudioImpl->setGain(vol);
106}
107
108F32 KOKUAStreamingAudio::getInternetStreamGain()
109{
110 if (mStreamingAudioImpl)
111 return mStreamingAudioImpl->getGain();
112 else
113 return 1.0f;
114}
115
116// virtual
117std::string KOKUAStreamingAudio::getInternetStreamURL()
118{
119 if (mStreamingAudioImpl)
120 return mStreamingAudioImpl->getURL();
121 else return std::string();
122}
123
124std::string KOKUAStreamingAudio::getVersion()
125{
126 if (mStreamingAudioImpl)
127 return mStreamingAudioImpl->getVersion();
128 else return std::string();
129} \ No newline at end of file
diff --git a/linden/indra/newview/kokuastreamingaudio.h b/linden/indra/newview/kokuastreamingaudio.h
new file mode 100644
index 0000000..eb49f25
--- /dev/null
+++ b/linden/indra/newview/kokuastreamingaudio.h
@@ -0,0 +1,71 @@
1/**
2 * @file kokuastreamingaudio.h
3 * @brief Definition of KOKUAStreamingAudio base class for streaming audio support
4 *
5 * $LicenseInfo:firstyear=2011&license=viewergpl$
6 * Kokua Viewer Source Code
7 * Copyright (C) 2011, Armin.Weatherwax (at) googlemail.com
8 * for the Kokua Viewer Team.
9 *
10 * The source code in this file ("Source Code") is provided by the author
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in this
13 * distribution, or online at
14 * http://secondlifegrid.net/programs/open_source/licensing/gplv2
15 *
16 * There are special exceptions to the terms and conditions of the GPL as
17 * it is applied to this Source Code. View the full text of the exception
18 * in the file doc/FLOSS-exception.txt in this software distribution, or
19 * online at
20 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * THIS SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 *
30 * $/LicenseInfo$
31 */
32#ifndef KOKUA_STREAMINGAUDIO_H
33#define KOKUA_STREAMINGAUDIO_H
34
35#include "linden_common.h"
36
37class LLStreamingAudioInterface;
38
39class KOKUAStreamingAudio
40{
41public:
42 enum KOKUAAudioPlayState
43 {
44 // isInternetStreamPlaying() returns an *int*, with
45 // 0 = stopped, 1 = playing, 2 = paused.
46 AUDIO_STOPPED = 0,
47 AUDIO_PLAYING = 1,
48 AUDIO_PAUSED = 2
49 };
50
51 KOKUAStreamingAudio(LLStreamingAudioInterface *impl);
52 virtual ~KOKUAStreamingAudio();
53
54 LLStreamingAudioInterface *getStreamingAudioImpl();
55// void setStreamingAudioImpl(LLStreamingAudioInterface *impl);
56 void startInternetStream(const std::string& url);
57 void stopInternetStream();
58 void pauseInternetStream(int pause);
59 void updateInternetStream();
60 KOKUAAudioPlayState isInternetStreamPlaying();
61 void setInternetStreamGain(F32 vol);
62 F32 getInternetStreamGain();
63 std::string getInternetStreamURL();
64 std::string getVersion();
65private:
66 LLStreamingAudioInterface *mStreamingAudioImpl;
67};
68
69extern KOKUAStreamingAudio* gAudioStream;
70
71#endif
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 5a1700a..515d588 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -7488,7 +7488,7 @@ void LLAgent::sendAgentSetAppearance()
7488 param; 7488 param;
7489 param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam()) 7489 param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam())
7490 { 7490 {
7491 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 7491 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) // do not transmit params of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT
7492 { 7492 {
7493 msg->nextBlockFast(_PREHASH_VisualParam ); 7493 msg->nextBlockFast(_PREHASH_VisualParam );
7494 7494
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index d7b6814..5826041 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -104,6 +104,7 @@
104#include "llassetstorage.h" 104#include "llassetstorage.h"
105#include "llpolymesh.h" 105#include "llpolymesh.h"
106#include "llcachename.h" 106#include "llcachename.h"
107#include "kokuastreamingaudio.h"
107#include "llaudioengine.h" 108#include "llaudioengine.h"
108#include "llstreamingaudio.h" 109#include "llstreamingaudio.h"
109#include "llviewermenu.h" 110#include "llviewermenu.h"
@@ -920,7 +921,7 @@ bool LLAppViewer::mainLoop()
920 //------------------------------------------- 921 //-------------------------------------------
921 922
922 // Create IO Pump to use for HTTP Requests. 923 // Create IO Pump to use for HTTP Requests.
923 gServicePump = new LLPumpIO(gAPRPoolp); 924 gServicePump = new LLPumpIO;
924 LLHTTPClient::setPump(*gServicePump); 925 LLHTTPClient::setPump(*gServicePump);
925 LLCurl::setCAFile(gDirUtilp->getCAFile()); 926 LLCurl::setCAFile(gDirUtilp->getCAFile());
926 927
@@ -1258,6 +1259,7 @@ bool LLAppViewer::cleanup()
1258 1259
1259 LLPolyMesh::freeAllMeshes(); 1260 LLPolyMesh::freeAllMeshes();
1260 1261
1262 LLAvatarNameCache::cleanupClass();
1261 delete gCacheName; 1263 delete gCacheName;
1262 gCacheName = NULL; 1264 gCacheName = NULL;
1263 1265
@@ -1278,14 +1280,16 @@ bool LLAppViewer::cleanup()
1278 1280
1279 llinfos << "Global stuff deleted" << llendflush; 1281 llinfos << "Global stuff deleted" << llendflush;
1280 1282
1281 if (gAudiop) 1283 if (gAudioStream)
1282 { 1284 {
1283 // shut down the streaming audio sub-subsystem first, in case it relies on not outliving the general audio subsystem. 1285 // shut down the streaming audio sub-subsystem first, in case it relies on not outliving the general audio subsystem.
1284 1286
1285 LLStreamingAudioInterface *sai = gAudiop->getStreamingAudioImpl(); 1287 delete gAudioStream;
1286 delete sai; 1288 gAudioStream = NULL;
1287 gAudiop->setStreamingAudioImpl(NULL); 1289 }
1288 1290
1291 if (gAudiop)
1292 {
1289 // shut down the audio subsystem 1293 // shut down the audio subsystem
1290 1294
1291 bool want_longname = false; 1295 bool want_longname = false;
@@ -1642,19 +1646,37 @@ bool LLAppViewer::initLogging()
1642 LLError::initForApplication( 1646 LLError::initForApplication(
1643 gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); 1647 gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
1644 LLError::setFatalFunction(errorCallback); 1648 LLError::setFatalFunction(errorCallback);
1645 1649 std::string log_name = "meta-impy.log";
1646 // Remove the last ".old" log file.
1647 std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1648 "meta-impy.old");
1649 LLFile::remove(old_log_file);
1650 1650
1651 // Rename current log file to ".old" 1651 const int MAX_ROTATION = 5;
1652 std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, 1652 for(int i = MAX_ROTATION; 0 < i; i--)
1653 "meta-impy.log"); 1653 {
1654 LLFile::rename(log_file, old_log_file); 1654 std::ostringstream current;
1655 current << ".";
1656 current << i;
1655 1657
1656 // Set the log file to Imprudence.log 1658 std::ostringstream previous;
1659 if( 1 < i )
1660 {
1661 previous << ".";
1662 previous << i-1;
1663 }
1664
1665 std::string current_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1666 log_name + current.str());
1667 std::string previous_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1668 log_name + previous.str());
1669
1670 if (MAX_ROTATION == i)
1671 {
1672 LLFile::remove(current_log_file);
1673 }
1674
1675 LLFile::rename(previous_log_file, current_log_file);
1676 }
1657 1677
1678 // Set the log file to Imprudence.log
1679 std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, log_name);
1658 LLError::logToFile(log_file); 1680 LLError::logToFile(log_file);
1659 1681
1660 // *FIX:Mani no error handling here! 1682 // *FIX:Mani no error handling here!
@@ -1861,6 +1883,7 @@ bool LLAppViewer::initConfiguration()
1861 LLFirstUse::addConfigVariable("FirstVoice"); 1883 LLFirstUse::addConfigVariable("FirstVoice");
1862 LLFirstUse::addConfigVariable("FirstMedia"); 1884 LLFirstUse::addConfigVariable("FirstMedia");
1863 LLFirstUse::addConfigVariable("FirstLoginScreen"); 1885 LLFirstUse::addConfigVariable("FirstLoginScreen");
1886 LLFirstUse::addConfigVariable("FirstPrivacy");
1864 1887
1865// [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a 1888// [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a
1866 //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_DETACH); 1889 //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_DETACH);
@@ -3296,6 +3319,14 @@ void LLAppViewer::saveFinalSnapshot()
3296 3319
3297void LLAppViewer::loadNameCache() 3320void LLAppViewer::loadNameCache()
3298{ 3321{
3322 // display names cache
3323 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml");
3324 llifstream name_cache_stream(filename);
3325 if (name_cache_stream.is_open())
3326 {
3327 LLAvatarNameCache::importFile(name_cache_stream);
3328 }
3329
3299 if (!gCacheName) return; 3330 if (!gCacheName) return;
3300 3331
3301 std::string name_cache; 3332 std::string name_cache;
@@ -3318,6 +3349,14 @@ void LLAppViewer::loadNameCache()
3318 3349
3319void LLAppViewer::saveNameCache() 3350void LLAppViewer::saveNameCache()
3320{ 3351{
3352 // display names cache
3353 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml");
3354 llofstream name_cache_stream(filename);
3355 if (name_cache_stream.is_open())
3356 {
3357 LLAvatarNameCache::exportFile(name_cache_stream);
3358 }
3359
3321 if (!gCacheName) return; 3360 if (!gCacheName) return;
3322 3361
3323 std::string name_cache; 3362 std::string name_cache;
@@ -3469,18 +3508,22 @@ void LLAppViewer::idle()
3469 // Initialize the viewer_stats_timer with an already elapsed time 3508 // Initialize the viewer_stats_timer with an already elapsed time
3470 // of SEND_STATS_PERIOD so that the initial stats report will 3509 // of SEND_STATS_PERIOD so that the initial stats report will
3471 // be sent immediately. 3510 // be sent immediately.
3472 static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD); 3511 if(!gDisconnected && gHippoGridManager->getConnectedGrid()->isSecondLife())
3473 reset_statistics();
3474
3475 // Update session stats every large chunk of time
3476 // *FIX: (???) SAMANTHA
3477 /* or don't! part of a larger effort to waste less CPU cycles. -Patrick Sapinski (Sunday, November 29, 2009)
3478 if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected)
3479 { 3512 {
3480 llinfos << "Transmitting sessions stats" << llendl; 3513 static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
3481 send_stats(); 3514 reset_statistics();
3482 viewer_stats_timer.reset(); 3515
3483 } */ 3516 // Update session stats every large chunk of time
3517 // *FIX: (???) SAMANTHA
3518
3519 /* or don't! part of a larger effort to waste less CPU cycles. -Patrick Sapinski (Sunday, November 29, 2009)*/
3520 if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD )
3521 {
3522 llinfos << "Transmitting sessions stats" << llendl;
3523 send_stats();
3524 viewer_stats_timer.reset();
3525 }
3526 }
3484 3527
3485 // Print the object debugging stats 3528 // Print the object debugging stats
3486 static LLFrameTimer object_debug_timer; 3529 static LLFrameTimer object_debug_timer;
@@ -3518,6 +3561,8 @@ void LLAppViewer::idle()
3518 // floating throughout the various object lists. 3561 // floating throughout the various object lists.
3519 // 3562 //
3520 3563
3564 idleNameCache();
3565
3521 gFrameStats.start(LLFrameStats::IDLE_NETWORK); 3566 gFrameStats.start(LLFrameStats::IDLE_NETWORK);
3522 stop_glerror(); 3567 stop_glerror();
3523 idleNetwork(); 3568 idleNetwork();
@@ -3732,6 +3777,10 @@ void LLAppViewer::idle()
3732 const F32 max_audio_decode_time = 0.002f; // 2 ms decode time 3777 const F32 max_audio_decode_time = 0.002f; // 2 ms decode time
3733 gAudiop->idle(max_audio_decode_time); 3778 gAudiop->idle(max_audio_decode_time);
3734 } 3779 }
3780
3781 // update streaming audio
3782 if (gAudioStream)
3783 gAudioStream->updateInternetStream();
3735 } 3784 }
3736 3785
3737 3786
@@ -3895,6 +3944,60 @@ void LLAppViewer::sendLogoutRequest()
3895 } 3944 }
3896} 3945}
3897 3946
3947void LLAppViewer::idleNameCache()
3948{
3949 // Neither old nor new name cache can function before agent has a region
3950 LLViewerRegion* region = gAgent.getRegion();
3951 if (!region) return;
3952
3953 // deal with any queued name requests and replies.
3954 gCacheName->processPending();
3955
3956 // Can't run the new cache until we have the list of capabilities
3957 // for the agent region, and can therefore decide whether to use
3958 // display names or fall back to the old name system.
3959 if (!region->capabilitiesReceived()) return;
3960
3961 // Agent may have moved to a different region, so need to update cap URL
3962 // for name lookups. Can't do this in the cap grant code, as caps are
3963 // granted to neighbor regions before the main agent gets there. Can't
3964 // do it in the move-into-region code because cap not guaranteed to be
3965 // granted yet, for example on teleport.
3966 bool had_capability = LLAvatarNameCache::hasNameLookupURL();
3967 std::string name_lookup_url;
3968 name_lookup_url.reserve(128); // avoid a memory allocation below
3969 name_lookup_url = region->getCapability("GetDisplayNames");
3970 bool have_capability = !name_lookup_url.empty();
3971 if (have_capability)
3972 {
3973 // we have support for display names, use it
3974 U32 url_size = name_lookup_url.size();
3975 // capabilities require URLs with slashes before query params:
3976 // https://<host>:<port>/cap/<uuid>/?ids=<blah>
3977 // but the caps are granted like:
3978 // https://<host>:<port>/cap/<uuid>
3979 if (url_size > 0 && name_lookup_url[url_size-1] != '/')
3980 {
3981 name_lookup_url += '/';
3982 }
3983 LLAvatarNameCache::setNameLookupURL(name_lookup_url);
3984 }
3985 else
3986 {
3987 // Display names not available on this region
3988 LLAvatarNameCache::setNameLookupURL( std::string() );
3989 }
3990
3991 // Error recovery - did we change state?
3992 if (had_capability != have_capability)
3993 {
3994 // name tags are persistant on screen, so make sure they refresh
3995 LLVOAvatar::invalidateNameTags();
3996 }
3997
3998 LLAvatarNameCache::idle();
3999}
4000
3898// 4001//
3899// Handle messages, and all message related stuff 4002// Handle messages, and all message related stuff
3900// 4003//
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h
index 7c9fe89..522050a 100644
--- a/linden/indra/newview/llappviewer.h
+++ b/linden/indra/newview/llappviewer.h
@@ -192,6 +192,7 @@ private:
192 192
193 void idle(); 193 void idle();
194 void idleShutdown(); 194 void idleShutdown();
195 void idleNameCache();
195 void idleNetwork(); 196 void idleNetwork();
196 197
197 void sendLogoutRequest(); 198 void sendLogoutRequest();
diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp
index 307f925..88ddf7e 100644
--- a/linden/indra/newview/llappviewerlinux.cpp
+++ b/linden/indra/newview/llappviewerlinux.cpp
@@ -129,6 +129,7 @@ int main( int argc, char **argv )
129 } 129 }
130 delete viewer_app_ptr; 130 delete viewer_app_ptr;
131 viewer_app_ptr = NULL; 131 viewer_app_ptr = NULL;
132
132 return 0; 133 return 0;
133} 134}
134 135
diff --git a/linden/indra/newview/llappviewermacosx.cpp b/linden/indra/newview/llappviewermacosx.cpp
index 91de066..d81b6e3 100644
--- a/linden/indra/newview/llappviewermacosx.cpp
+++ b/linden/indra/newview/llappviewermacosx.cpp
@@ -119,6 +119,7 @@ int main( int argc, char **argv )
119 } 119 }
120 delete viewer_app_ptr; 120 delete viewer_app_ptr;
121 viewer_app_ptr = NULL; 121 viewer_app_ptr = NULL;
122
122 return 0; 123 return 0;
123} 124}
124 125
diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp
index 0fc273e..6f67c3f 100644
--- a/linden/indra/newview/llappviewerwin32.cpp
+++ b/linden/indra/newview/llappviewerwin32.cpp
@@ -78,31 +78,6 @@ extern "C" {
78#endif 78#endif
79#endif 79#endif
80 80
81// Force Imprudence to link against the correct boost libraries -- McCabe
82#if defined(_MSC_VER)
83#if _MSC_VER >= 1500
84#ifdef LL_DEBUG
85#pragma comment( lib, "libboost_signals-vc90-mt-gd-1_36.lib" )
86#pragma comment( lib, "libboost_regex-vc90-mt-gd-1_36.lib" )
87#pragma comment( lib, "libboost_program_options-vc90-mt-gd-1_36.lib" )
88#else
89#pragma comment( lib, "libboost_signals-vc90-mt-1_36.lib" )
90#pragma comment( lib, "libboost_regex-vc90-mt-1_36.lib" )
91#pragma comment( lib, "libboost_program_options-vc90-mt-1_36.lib" )
92#endif
93#elif _MSC_VER >= 1400
94#ifdef LL_DEBUG
95#pragma comment( lib, "libboost_signals-vc80-mt-gd-1_36.lib" )
96#pragma comment( lib, "libboost_regex-vc80-mt-gd-1_36.lib" )
97#pragma comment( lib, "libboost_program_options-vc80-mt-gd-1_36.lib" )
98#else
99#pragma comment( lib, "libboost_signals-vc80-mt-1_36.lib" )
100#pragma comment( lib, "libboost_regex-vc80-mt-1_36.lib" )
101#pragma comment( lib, "libboost_program_options-vc80-mt-1_36.lib" )
102#endif
103#endif
104#endif
105
106const std::string LLAppViewerWin32::sWindowClass = "meta-impy"; 81const std::string LLAppViewerWin32::sWindowClass = "meta-impy";
107 82
108LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop) 83LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp
index 15be0eb..f1328be 100644
--- a/linden/indra/newview/llcallingcard.cpp
+++ b/linden/indra/newview/llcallingcard.cpp
@@ -613,6 +613,25 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
613 LLSD args; 613 LLSD args;
614 if(gCacheName->getName(agent_id, first, last)) 614 if(gCacheName->getName(agent_id, first, last))
615 { 615 {
616 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
617 {
618 LLAvatarName avatar_name;
619 if (LLAvatarNameCache::get(agent_id, &avatar_name))
620 {
621 // Always show "Display Name [Legacy Name]" for security reasons
622 first = avatar_name.getNames();
623 size_t i = first.find(" ");
624 if (i != std::string::npos)
625 {
626 last = first.substr(i + 1);
627 first = first.substr(0, i);
628 }
629 else
630 {
631 last = "";
632 }
633 }
634 }
616 args["FIRST_NAME"] = first; 635 args["FIRST_NAME"] = first;
617 args["LAST_NAME"] = last; 636 args["LAST_NAME"] = last;
618 } 637 }
@@ -669,6 +688,31 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
669 std::string first, last; 688 std::string first, last;
670 if(gCacheName->getName(agent_id, first, last)) 689 if(gCacheName->getName(agent_id, first, last))
671 { 690 {
691 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
692 {
693 LLAvatarName avatar_name;
694 if (LLAvatarNameCache::get(agent_id, &avatar_name))
695 {
696 if (LLAvatarNameCache::useDisplayNames() == 1)
697 {
698 first = avatar_name.mDisplayName;
699 }
700 else
701 {
702 first = avatar_name.getNames();
703 }
704 size_t i = first.find(" ");
705 if (i != std::string::npos)
706 {
707 last = first.substr(i + 1);
708 first = first.substr(0, i);
709 }
710 else
711 {
712 last = "";
713 }
714 }
715 }
672 notify = TRUE; 716 notify = TRUE;
673 args["FIRST"] = first; 717 args["FIRST"] = first;
674 args["LAST"] = last; 718 args["LAST"] = last;
@@ -745,6 +789,12 @@ void LLAvatarTracker::processTerminateFriendship(LLMessageSystem* msg, void**)
745 } 789 }
746} 790}
747 791
792void LLAvatarTracker::dirtyBuddies()
793{
794 mModifyMask |= LLFriendObserver::REMOVE | LLFriendObserver::ADD;
795 notifyObservers();
796}
797
748///---------------------------------------------------------------------------- 798///----------------------------------------------------------------------------
749/// Tracking Data 799/// Tracking Data
750///---------------------------------------------------------------------------- 800///----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llcallingcard.h b/linden/indra/newview/llcallingcard.h
index d3f53c6..d5496ae 100644
--- a/linden/indra/newview/llcallingcard.h
+++ b/linden/indra/newview/llcallingcard.h
@@ -122,6 +122,9 @@ public:
122 // deal with termination of friendhsip 122 // deal with termination of friendhsip
123 void terminateBuddy(const LLUUID& id); 123 void terminateBuddy(const LLUUID& id);
124 124
125 // flag the buddy list dirty to force an update
126 void dirtyBuddies();
127
125 // get full info 128 // get full info
126 const LLRelationship* getBuddyInfo(const LLUUID& id) const; 129 const LLRelationship* getBuddyInfo(const LLUUID& id) const;
127 130
diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp
index a59fa06..ec4e294 100644
--- a/linden/indra/newview/llfilepicker.cpp
+++ b/linden/indra/newview/llfilepicker.cpp
@@ -1181,7 +1181,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
1181 break; 1181 break;
1182 case FFSAVE_RAW: 1182 case FFSAVE_RAW:
1183 caption += add_simple_pattern_filter_to_gtkchooser 1183 caption += add_simple_pattern_filter_to_gtkchooser
1184 (picker, "*.raw", LLTrans::getString("dot_raw_file") + " (*.raw)"); 1184 (picker, "*.raw", LLTrans::getString("raw_file") + " (*.raw)");
1185 suggest_ext = ".raw"; 1185 suggest_ext = ".raw";
1186 break; 1186 break;
1187 case FFSAVE_J2C: 1187 case FFSAVE_J2C:
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index 18efa9e..f482d1c 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -390,3 +390,31 @@ void LLFirstUse::voiceLicenseAgreement()
390 LLStartUp::setStartupState(STATE_LOGIN_AUTH_INIT); 390 LLStartUp::setStartupState(STATE_LOGIN_AUTH_INIT);
391 } 391 }
392} 392}
393
394void LLFirstUse::callbackPrivacy(const LLSD& notification, const LLSD& response)
395{
396
397 S32 option = LLNotification::getSelectedOption(notification, response);
398 if ( 0 == option )
399 {
400 gSavedSettings.setWarning("FirstPrivacy", FALSE);
401 LLStartUp::setStartupState(STATE_PRIVACY_LECTURED);
402 }
403 if ( 1 == option )
404 {
405 LLStartUp::resetLogin();
406 }
407}
408
409// static
410void LLFirstUse::Privacy()
411{
412 if (gSavedSettings.getWarning("FirstPrivacy"))
413 {
414 LLNotifications::instance().add("FirstPrivacy", LLSD(), LLSD(), callbackPrivacy);
415 }
416 else
417 {
418 LLStartUp::setStartupState(STATE_PRIVACY_LECTURED);
419 }
420} \ No newline at end of file
diff --git a/linden/indra/newview/llfirstuse.h b/linden/indra/newview/llfirstuse.h
index 42443ff..8c2ca35 100644
--- a/linden/indra/newview/llfirstuse.h
+++ b/linden/indra/newview/llfirstuse.h
@@ -116,7 +116,8 @@ public:
116 static void callbackClientTags(const LLSD& notification, const LLSD& response); 116 static void callbackClientTags(const LLSD& notification, const LLSD& response);
117 static void ClientTags(); 117 static void ClientTags();
118 static void voiceLicenseAgreement(); 118 static void voiceLicenseAgreement();
119 119 static void callbackPrivacy(const LLSD& notification, const LLSD& response);
120 static void Privacy();
120protected: 121protected:
121 static std::set<std::string> sConfigVariables; 122 static std::set<std::string> sConfigVariables;
122 123
diff --git a/linden/indra/newview/llfloateractivespeakers.cpp b/linden/indra/newview/llfloateractivespeakers.cpp
index 59de717..75cf176 100644
--- a/linden/indra/newview/llfloateractivespeakers.cpp
+++ b/linden/indra/newview/llfloateractivespeakers.cpp
@@ -92,18 +92,19 @@ LLSpeaker::LLSpeaker(const LLUUID& id, const std::string& name, const ESpeakerTy
92 92
93void LLSpeaker::lookupName() 93void LLSpeaker::lookupName()
94{ 94{
95 gCacheName->getName(mID, onAvatarNameLookup, new LLHandle<LLSpeaker>(getHandle())); 95 LLAvatarNameCache::get(mID, boost::bind(&LLSpeaker::onAvatarNameLookup, _1, _2, new LLHandle<LLSpeaker>(getHandle())));
96} 96}
97 97
98//static 98//static
99void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* user_data) 99void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data)
100{ 100{
101 LLSpeaker* speaker_ptr = ((LLHandle<LLSpeaker>*)user_data)->get(); 101 LLSpeaker* speaker_ptr = ((LLHandle<LLSpeaker>*)user_data)->get();
102 delete (LLHandle<LLSpeaker>*)user_data; 102 delete (LLHandle<LLSpeaker>*)user_data;
103 103
104 if (speaker_ptr) 104 if (speaker_ptr)
105 { 105 {
106 speaker_ptr->mDisplayName = first + " " + last; 106 // Always show "Display Name [Legacy Name]" for security reasons
107 speaker_ptr->mDisplayName = avatar_name.getNames();
107// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g 108// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g
108 // TODO-RLVa: this seems to get called per frame which is very likely an LL bug that will eventuall get fixed 109 // TODO-RLVa: this seems to get called per frame which is very likely an LL bug that will eventuall get fixed
109 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) 110 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
diff --git a/linden/indra/newview/llfloateractivespeakers.h b/linden/indra/newview/llfloateractivespeakers.h
index b2c44e2..dc3dd73 100644
--- a/linden/indra/newview/llfloateractivespeakers.h
+++ b/linden/indra/newview/llfloateractivespeakers.h
@@ -33,6 +33,7 @@
33#ifndef LL_LLFLOATERACTIVESPEAKERS_H 33#ifndef LL_LLFLOATERACTIVESPEAKERS_H
34#define LL_LLFLOATERACTIVESPEAKERS_H 34#define LL_LLFLOATERACTIVESPEAKERS_H
35 35
36#include "llavatarnamecache.h"
36#include "llfloater.h" 37#include "llfloater.h"
37#include "llmemory.h" 38#include "llmemory.h"
38#include "llvoiceclient.h" 39#include "llvoiceclient.h"
@@ -73,7 +74,7 @@ public:
73 ~LLSpeaker() {}; 74 ~LLSpeaker() {};
74 void lookupName(); 75 void lookupName();
75 76
76 static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* user_data); 77 static void onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data);
77 78
78 ESpeakerStatus mStatus; // current activity status in speech group 79 ESpeakerStatus mStatus; // current activity status in speech group
79 F32 mLastSpokeTime; // timestamp when this speaker last spoke 80 F32 mLastSpokeTime; // timestamp when this speaker last spoke
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp
index 0618875..13805fb 100644
--- a/linden/indra/newview/llfloateravatarinfo.cpp
+++ b/linden/indra/newview/llfloateravatarinfo.cpp
@@ -122,7 +122,7 @@ LLFloaterAvatarInfo::LLFloaterAvatarInfo(const std::string& name, const LLRect &
122 } 122 }
123 123
124 gAvatarInfoInstances.addData(avatar_id, this); // must be done before callback below is called. 124 gAvatarInfoInstances.addData(avatar_id, this); // must be done before callback below is called.
125 gCacheName->get(avatar_id, FALSE, callbackLoadAvatarName); 125 LLAvatarNameCache::get(avatar_id, boost::bind(&LLFloaterAvatarInfo::callbackLoadAvatarName, _1, _2));
126} 126}
127 127
128// virtual 128// virtual
@@ -242,18 +242,16 @@ void LLFloaterAvatarInfo::showProfileCallback(S32 option, void *userdata)
242 242
243// static 243// static
244void LLFloaterAvatarInfo::callbackLoadAvatarName(const LLUUID& id, 244void LLFloaterAvatarInfo::callbackLoadAvatarName(const LLUUID& id,
245 const std::string& first, 245 const LLAvatarName& avatar_name)
246 const std::string& last,
247 BOOL is_group,
248 void* data)
249{ 246{
250 LLFloaterAvatarInfo *floater = gAvatarInfoInstances.getIfThere(id); 247 LLFloaterAvatarInfo *floater = gAvatarInfoInstances.getIfThere(id);
251 248
252 if (floater) 249 if (floater)
253 { 250 {
254 // Build a new title including the avatar name. 251 // Build a new title including the avatar name.
252 // Always show "Display Name [Legacy Name]" for security reasons
255 std::ostringstream title; 253 std::ostringstream title;
256 title << first << " " << last << " - " << floater->getTitle(); 254 title << avatar_name.getNames() << " - " << floater->getTitle();
257 floater->setTitle(title.str()); 255 floater->setTitle(title.str());
258 } 256 }
259} 257}
diff --git a/linden/indra/newview/llfloateravatarinfo.h b/linden/indra/newview/llfloateravatarinfo.h
index 1cc17d1..f65e1f4 100644
--- a/linden/indra/newview/llfloateravatarinfo.h
+++ b/linden/indra/newview/llfloateravatarinfo.h
@@ -39,6 +39,7 @@
39#ifndef LL_LLFLOATERAVATARINFO_H 39#ifndef LL_LLFLOATERAVATARINFO_H
40#define LL_LLFLOATERAVATARINFO_H 40#define LL_LLFLOATERAVATARINFO_H
41 41
42#include "llavatarnamecache.h"
42#include "llfloater.h" 43#include "llfloater.h"
43#include "llpreview.h" 44#include "llpreview.h"
44#include "lluuid.h" 45#include "lluuid.h"
@@ -91,8 +92,7 @@ public:
91 92
92 static LLFloaterAvatarInfo* getInstance(const LLUUID &id); 93 static LLFloaterAvatarInfo* getInstance(const LLUUID &id);
93 static void showProfileCallback(S32 option, void *userdata); 94 static void showProfileCallback(S32 option, void *userdata);
94 static void callbackLoadAvatarName(const LLUUID& id, 95 static void callbackLoadAvatarName(const LLUUID& agent_id, const LLAvatarName& avatar_name);
95 const std::string& first, const std::string& last, BOOL is_group, void* data);
96 void resetGroupList(); 96 void resetGroupList();
97 97
98private: 98private:
diff --git a/linden/indra/newview/llfloaterchatterbox.cpp b/linden/indra/newview/llfloaterchatterbox.cpp
index 1ef75d1..ba1c83c 100644
--- a/linden/indra/newview/llfloaterchatterbox.cpp
+++ b/linden/indra/newview/llfloaterchatterbox.cpp
@@ -43,6 +43,7 @@
43#include "llviewercontrol.h" 43#include "llviewercontrol.h"
44#include "llimview.h" 44#include "llimview.h"
45#include "llimpanel.h" 45#include "llimpanel.h"
46#include "llcallingcard.h"
46 47
47// 48//
48// LLFloaterMyFriends 49// LLFloaterMyFriends
@@ -218,6 +219,8 @@ void LLFloaterChatterBox::draw()
218void LLFloaterChatterBox::onOpen() 219void LLFloaterChatterBox::onOpen()
219{ 220{
220 gSavedSettings.setBOOL("ShowCommunicate", TRUE); 221 gSavedSettings.setBOOL("ShowCommunicate", TRUE);
222 // Force a refresh to get latest display names in the new IM panel.
223 LLAvatarTracker::instance().dirtyBuddies();
221} 224}
222 225
223void LLFloaterChatterBox::onClose(bool app_quitting) 226void LLFloaterChatterBox::onClose(bool app_quitting)
diff --git a/linden/indra/newview/llfloatercustomize.cpp b/linden/indra/newview/llfloatercustomize.cpp
index db51556..21dfc36 100644
--- a/linden/indra/newview/llfloatercustomize.cpp
+++ b/linden/indra/newview/llfloatercustomize.cpp
@@ -448,9 +448,7 @@ LLPanelEditWearable::LLPanelEditWearable( EWearableType type )
448BOOL LLPanelEditWearable::postBuild() 448BOOL LLPanelEditWearable::postBuild()
449{ 449{
450 LLAssetType::EType asset_type = LLWearable::typeToAssetType( mType ); 450 LLAssetType::EType asset_type = LLWearable::typeToAssetType( mType );
451 std::string icon_name = (asset_type == LLAssetType::AT_CLOTHING ? 451 std::string icon_name = get_item_icon_name(asset_type, LLInventoryType::IT_WEARABLE, mType, FALSE);
452 "inv_item_clothing.tga" :
453 "inv_item_skin.tga" );
454 childSetValue("icon", icon_name); 452 childSetValue("icon", icon_name);
455 453
456 childSetAction("Create New", LLPanelEditWearable::onBtnCreateNew, this ); 454 childSetAction("Create New", LLPanelEditWearable::onBtnCreateNew, this );
@@ -553,7 +551,7 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart )
553 param = (LLViewerVisualParam *)avatar->getNextVisualParam()) 551 param = (LLViewerVisualParam *)avatar->getNextVisualParam())
554 { 552 {
555 if (param->getID() == -1 553 if (param->getID() == -1
556 || param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE 554 || !param->isTweakable()
557 || param->getEditGroup() != part->mEditGroup 555 || param->getEditGroup() != part->mEditGroup
558 || !(param->getSex() & avatar_sex)) 556 || !(param->getSex() & avatar_sex))
559 { 557 {
@@ -763,7 +761,6 @@ void LLPanelEditWearable::onColorCommit( LLUICtrl* ctrl, void* userdata )
763 } 761 }
764} 762}
765 763
766
767void LLPanelEditWearable::initPreviousTextureList() 764void LLPanelEditWearable::initPreviousTextureList()
768{ 765{
769 initPreviousTextureListEntry(TEX_LOWER_ALPHA); 766 initPreviousTextureListEntry(TEX_LOWER_ALPHA);
@@ -2338,6 +2335,7 @@ void LLFloaterCustomize::initWearablePanels()
2338 panel->addTextureDropTarget(TEX_HEAD_TATTOO, "Head Tattoo", 2335 panel->addTextureDropTarget(TEX_HEAD_TATTOO, "Head Tattoo",
2339 LLUUID::null, 2336 LLUUID::null,
2340 TRUE); 2337 TRUE);
2338 panel->addColorSwatch(TEX_LOWER_TATTOO, "Color/Tint");
2341 } 2339 }
2342} 2340}
2343 2341
diff --git a/linden/indra/newview/llfloaterdirectory.cpp b/linden/indra/newview/llfloaterdirectory.cpp
index 8018c31..7c8ddf1 100644
--- a/linden/indra/newview/llfloaterdirectory.cpp
+++ b/linden/indra/newview/llfloaterdirectory.cpp
@@ -466,7 +466,9 @@ void LLFloaterDirectory::setVisible(BOOL visible)
466 466
467void LLFloaterDirectory::onClose(bool app_quitting) 467void LLFloaterDirectory::onClose(bool app_quitting)
468{ 468{
469 setVisible(FALSE); 469 LLFloater::onClose(app_quitting);
470
471 //setVisible(FALSE); //meaning you hide 3 web browsers - one SLPlugin each
470} 472}
471 473
472// static 474// static
diff --git a/linden/indra/newview/llfloaterdisplayname.cpp b/linden/indra/newview/llfloaterdisplayname.cpp
new file mode 100644
index 0000000..31ceda9
--- /dev/null
+++ b/linden/indra/newview/llfloaterdisplayname.cpp
@@ -0,0 +1,224 @@
1/**
2 * @file llfloaterdisplayname.cpp
3 * @author Leyla Farazha
4 * @brief Implementation of the LLFloaterDisplayName class.
5 *
6 * $LicenseInfo:firstyear=2002&license=viewerlgpl$
7 * Second Life Viewer Source Code
8 * Copyright (C) 2010, Linden Research, Inc.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation;
13 * version 2.1 of the License only.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
25 * $/LicenseInfo$
26 */
27
28
29#include "llviewerprecompiledheaders.h"
30#include "llfloater.h"
31
32#include "llnotifications.h"
33#include "llviewerdisplayname.h"
34
35#include "llnotify.h"
36#include "llfloaterdisplayname.h"
37#include "llavatarnamecache.h"
38#include "lluictrlfactory.h"
39#include "llviewercontrol.h"
40
41#include "llagent.h"
42
43
44LLFloaterDisplayName* LLFloaterDisplayName::sInstance = NULL;
45
46LLFloaterDisplayName::LLFloaterDisplayName() : LLFloater(std::string("Display Name"))
47{
48 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_display_name.xml");
49 LLFloaterDisplayName::sInstance = this;
50}
51
52LLFloaterDisplayName::~LLFloaterDisplayName()
53{
54 LLFloaterDisplayName::sInstance = NULL;
55}
56
57void LLFloaterDisplayName::show()
58{
59 if (!LLFloaterDisplayName::sInstance)
60 {
61 LLFloaterDisplayName::sInstance = new LLFloaterDisplayName();
62 }
63 LLFloaterDisplayName::sInstance->open();
64}
65
66void LLFloaterDisplayName::onOpen()
67{
68 getChild<LLUICtrl>("display_name_editor")->clear();
69 getChild<LLUICtrl>("display_name_confirm")->clear();
70
71 LLAvatarName av_name;
72 LLAvatarNameCache::get(gAgent.getID(), &av_name);
73
74 F64 now_secs = LLDate::now().secondsSinceEpoch();
75
76 if (now_secs < av_name.mNextUpdate)
77 {
78 // ...can't update until some time in the future
79 F64 next_update_local_secs = av_name.mNextUpdate;
80 std::string next_update_string;
81#ifdef LOCALIZED_TIME
82 timeToFormattedString((time_t)next_update_local_secs,
83 gSavedSettings.getString("LongDateFormat"),
84 next_update_string);
85#else
86 LLDate next_update_local(next_update_local_secs);
87 next_update_string = next_update_local.asString();
88#endif
89 getChild<LLUICtrl>("lockout_text")->setTextArg("[TIME]", next_update_string);
90 getChild<LLUICtrl>("lockout_text")->setVisible(true);
91 getChild<LLUICtrl>("now_ok_text")->setVisible(false);
92 getChild<LLUICtrl>("save_btn")->setEnabled(false);
93 getChild<LLUICtrl>("display_name_editor")->setEnabled(false);
94 getChild<LLUICtrl>("display_name_confirm")->setEnabled(false);
95 getChild<LLUICtrl>("cancel_btn")->setFocus(TRUE);
96
97 }
98 else
99 {
100 getChild<LLUICtrl>("lockout_text")->setVisible(false);
101 getChild<LLUICtrl>("now_ok_text")->setVisible(true);
102 getChild<LLUICtrl>("save_btn")->setEnabled(true);
103 getChild<LLUICtrl>("display_name_editor")->setEnabled(true);
104 getChild<LLUICtrl>("display_name_confirm")->setEnabled(true);
105
106 }
107}
108
109BOOL LLFloaterDisplayName::postBuild()
110{
111 childSetAction("reset_btn", onReset, this);
112 childSetAction("cancel_btn", onCancel, this);
113 childSetAction("save_btn", onSave, this);
114
115 center();
116
117 return TRUE;
118}
119
120void LLFloaterDisplayName::onCacheSetName(bool success,
121 const std::string& reason,
122 const LLSD& content)
123{
124 if (success)
125 {
126 // Inform the user that the change took place, but will take a while
127 // to percolate.
128 LLSD args;
129 args["DISPLAY_NAME"] = content["display_name"];
130 LLNotifications::instance().add("SetDisplayNameSuccess", args);
131
132 // Re-fetch my name, as it may have been sanitized by the service
133 //LLAvatarNameCache::get(getAvatarId(),
134 // boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
135 return;
136 }
137
138 // Request failed, notify the user
139 std::string error_tag = content["error_tag"].asString();
140 llinfos << "set name failure error_tag " << error_tag << llendl;
141
142 // We might have a localized string for this message
143 // error_args will usually be empty from the server.
144 if (!error_tag.empty()
145 && LLNotifications::getInstance()->templateExists(error_tag))
146 {
147 LLNotifications::instance().add(error_tag);
148 return;
149 }
150
151 // The server error might have a localized message for us
152 std::string lang_code = LLUI::getLanguage();
153 LLSD error_desc = content["error_description"];
154 if (error_desc.has( lang_code ))
155 {
156 LLSD args;
157 args["MESSAGE"] = error_desc[lang_code].asString();
158 LLNotifications::instance().add("GenericAlert", args);
159 return;
160 }
161
162 // No specific error, throw a generic one
163 LLNotifications::instance().add("SetDisplayNameFailedGeneric");
164}
165
166void LLFloaterDisplayName::onCancel(void* data)
167{
168 LLFloaterDisplayName* self = (LLFloaterDisplayName*)data;
169 self->setVisible(false);
170}
171
172void LLFloaterDisplayName::onReset(void* data)
173{
174 LLFloaterDisplayName* self = (LLFloaterDisplayName*)data;
175
176 if (LLAvatarNameCache::useDisplayNames())
177 {
178 LLViewerDisplayName::set("",
179 boost::bind(&LLFloaterDisplayName::onCacheSetName, self, _1, _2, _3));
180 }
181 else
182 {
183 LLNotifications::instance().add("SetDisplayNameFailedGeneric");
184 }
185
186 self->setVisible(false);
187}
188
189
190void LLFloaterDisplayName::onSave(void* data)
191{
192 LLFloaterDisplayName* self = (LLFloaterDisplayName*)data;
193
194 std::string display_name_utf8 = self->getChild<LLUICtrl>("display_name_editor")->getValue().asString();
195 std::string display_name_confirm = self->getChild<LLUICtrl>("display_name_confirm")->getValue().asString();
196
197 if (display_name_utf8.compare(display_name_confirm))
198 {
199 LLNotifications::instance().add("SetDisplayNameMismatch");
200 return;
201 }
202
203 const U32 DISPLAY_NAME_MAX_LENGTH = 31; // characters, not bytes
204 LLWString display_name_wstr = utf8string_to_wstring(display_name_utf8);
205 if (display_name_wstr.size() > DISPLAY_NAME_MAX_LENGTH)
206 {
207 LLSD args;
208 args["LENGTH"] = llformat("%d", DISPLAY_NAME_MAX_LENGTH);
209 LLNotifications::instance().add("SetDisplayNameFailedLength", args);
210 return;
211 }
212
213 if (LLAvatarNameCache::useDisplayNames())
214 {
215 LLViewerDisplayName::set(display_name_utf8,
216 boost::bind(&LLFloaterDisplayName::onCacheSetName, self, _1, _2, _3));
217 }
218 else
219 {
220 LLNotifications::instance().add("SetDisplayNameFailedGeneric");
221 }
222
223 self->setVisible(false);
224}
diff --git a/linden/indra/newview/llfloaterdisplayname.h b/linden/indra/newview/llfloaterdisplayname.h
new file mode 100644
index 0000000..4b25670
--- /dev/null
+++ b/linden/indra/newview/llfloaterdisplayname.h
@@ -0,0 +1,48 @@
1/**
2 * @file llfloaterdisplayname.h
3 *
4 * $LicenseInfo:firstyear=2009&license=viewerlgpl$
5 * Second Life Viewer Source Code
6 * Copyright (C) 2010, Linden Research, Inc.
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation;
11 * version 2.1 of the License only.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
23 * $/LicenseInfo$
24 */
25
26#ifndef LLFLOATERDISPLAYNAME_H
27#define LLFLOATERDISPLAYNAME_H
28
29
30class LLFloaterDisplayName : public LLFloater
31{
32public:
33 LLFloaterDisplayName();
34 virtual ~LLFloaterDisplayName();
35 /* virtual */ BOOL postBuild();
36 /* virtual */ void onOpen();
37 static void show();
38 static void onSave(void* data);
39 static void onReset(void* data);
40 static void onCancel(void* data);
41
42private:
43 static LLFloaterDisplayName* sInstance;
44 void onCacheSetName(bool success, const std::string& reason, const LLSD& content);
45};
46
47
48#endif
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index 0b4610c..cf25e8e 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -39,6 +39,7 @@
39 39
40#include <sstream> 40#include <sstream>
41 41
42#include "llavatarnamecache.h"
42#include "lldir.h" 43#include "lldir.h"
43 44
44#include "llagent.h" 45#include "llagent.h"
@@ -254,6 +255,24 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
254 255
255 std::string fullname; 256 std::string fullname;
256 BOOL have_name = gCacheName->getFullName(agent_id, fullname); 257 BOOL have_name = gCacheName->getFullName(agent_id, fullname);
258 if (have_name)
259 {
260 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
261 {
262 LLAvatarName avatar_name;
263 if (LLAvatarNameCache::get(agent_id, &avatar_name))
264 {
265 if (LLAvatarNameCache::useDisplayNames() == 1)
266 {
267 fullname = avatar_name.mDisplayName;
268 }
269 else
270 {
271 fullname = avatar_name.getNames();
272 }
273 }
274 }
275 }
257 276
258 LLSD element; 277 LLSD element;
259 element["id"] = agent_id; 278 element["id"] = agent_id;
@@ -332,6 +351,24 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh
332 351
333 std::string fullname; 352 std::string fullname;
334 BOOL have_name = gCacheName->getFullName(agent_id, fullname); 353 BOOL have_name = gCacheName->getFullName(agent_id, fullname);
354 if (have_name)
355 {
356 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
357 {
358 LLAvatarName avatar_name;
359 if (LLAvatarNameCache::get(agent_id, &avatar_name))
360 {
361 if (LLAvatarNameCache::useDisplayNames() == 1)
362 {
363 fullname = avatar_name.mDisplayName;
364 }
365 else
366 {
367 fullname = avatar_name.getNames();
368 }
369 }
370 }
371 }
335 372
336 // Name of the status icon to use 373 // Name of the status icon to use
337 std::string statusIcon; 374 std::string statusIcon;
@@ -790,6 +827,25 @@ void LLPanelFriends::onClickRemove(void* user_data)
790 std::string first, last; 827 std::string first, last;
791 if(gCacheName->getName(agent_id, first, last)) 828 if(gCacheName->getName(agent_id, first, last))
792 { 829 {
830 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
831 {
832 LLAvatarName avatar_name;
833 if (LLAvatarNameCache::get(agent_id, &avatar_name))
834 {
835 // Always show "Display Name [Legacy Name]" for security reasons
836 first = avatar_name.getNames();
837 size_t i = first.find(" ");
838 if (i != std::string::npos)
839 {
840 last = first.substr(i + 1);
841 first = first.substr(0, i);
842 }
843 else
844 {
845 last = "";
846 }
847 }
848 }
793 args["FIRST_NAME"] = first; 849 args["FIRST_NAME"] = first;
794 args["LAST_NAME"] = last; 850 args["LAST_NAME"] = last;
795 } 851 }
@@ -854,6 +910,25 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
854 std::string first, last; 910 std::string first, last;
855 if(gCacheName->getName(agent_id, first, last)) 911 if(gCacheName->getName(agent_id, first, last))
856 { 912 {
913 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
914 {
915 LLAvatarName avatar_name;
916 if (LLAvatarNameCache::get(agent_id, &avatar_name))
917 {
918 // Always show "Display Name [Legacy Name]" for security reasons
919 first = avatar_name.getNames();
920 size_t i = first.find(" ");
921 if (i != std::string::npos)
922 {
923 last = first.substr(i + 1);
924 first = first.substr(0, i);
925 }
926 else
927 {
928 last = "";
929 }
930 }
931 }
857 args["FIRST_NAME"] = first; 932 args["FIRST_NAME"] = first;
858 args["LAST_NAME"] = last; 933 args["LAST_NAME"] = last;
859 } 934 }
diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp
index 48920c1..272cb53 100644
--- a/linden/indra/newview/llfloaternewim.cpp
+++ b/linden/indra/newview/llfloaternewim.cpp
@@ -38,10 +38,9 @@
38#include "lltabcontainer.h" 38#include "lltabcontainer.h"
39#include "llimview.h" 39#include "llimview.h"
40 40
41S32 COL_1_WIDTH = 200; 41S32 COL_1_WIDTH = 400;
42 42
43static std::string sOnlineDescriptor = "*"; 43static std::string sOnlineDescriptor = "*";
44static std::string sNameFormat = "[FIRST] [LAST]";
45 44
46LLFloaterNewIM::LLFloaterNewIM() 45LLFloaterNewIM::LLFloaterNewIM()
47{ 46{
@@ -69,7 +68,6 @@ BOOL LLFloaterNewIM::postBuild()
69 llwarns << "LLUICtrlFactory::getNameListByName() returned NULL for 'user_list'" << llendl; 68 llwarns << "LLUICtrlFactory::getNameListByName() returned NULL for 'user_list'" << llendl;
70 } 69 }
71 sOnlineDescriptor = getString("online_descriptor"); 70 sOnlineDescriptor = getString("online_descriptor");
72 sNameFormat = getString("name_format");
73 setDefaultBtn("start_btn"); 71 setDefaultBtn("start_btn");
74 return TRUE; 72 return TRUE;
75 } 73 }
@@ -135,11 +133,8 @@ void LLFloaterNewIM::addGroup(const LLUUID& uuid, void* data, BOOL bold, BOOL on
135 133
136void LLFloaterNewIM::addAgent(const LLUUID& uuid, void* data, BOOL online) 134void LLFloaterNewIM::addAgent(const LLUUID& uuid, void* data, BOOL online)
137{ 135{
138 std::string first, last; 136 std::string fullname;
139 gCacheName->getName(uuid, first, last); 137 gCacheName->getFullName(uuid, fullname);
140 LLUIString fullname = sNameFormat;
141 fullname.setArg("[FIRST]", first);
142 fullname.setArg("[LAST]", last);
143 138
144 LLSD row; 139 LLSD row;
145 row["id"] = uuid; 140 row["id"] = uuid;
@@ -184,13 +179,20 @@ void LLFloaterNewIM::onStart(void* userdata)
184 const LLScrollListCell* cell = item->getColumn(0); 179 const LLScrollListCell* cell = item->getColumn(0);
185 std::string name(cell->getValue()); 180 std::string name(cell->getValue());
186 181
187 // *NOTE: Do a live detrmination of what type of session it 182 // *NOTE: Do a live determination of what type of session it
188 // should be. If we restrict the new im panel to online users, 183 // should be. If we restrict the new im panel to online users,
189 // then we can remove some of this code. 184 // then we can remove some of this code.
190 EInstantMessage type; 185 EInstantMessage type;
191 EInstantMessage* t = (EInstantMessage*)item->getUserdata(); 186 EInstantMessage* t = (EInstantMessage*)item->getUserdata();
192 if(t) type = (*t); 187 if(t) type = (*t);
193 else type = LLIMMgr::defaultIMTypeForAgent(item->getUUID()); 188 else type = LLIMMgr::defaultIMTypeForAgent(item->getUUID());
189 if (type != IM_SESSION_GROUP_START)
190 {
191 // Needed to avoid catching a display name, which would
192 // make us use a wrong IM log file...
193 gCacheName->getFullName(item->getUUID(), name);
194 }
195
194 gIMMgr->addSession(name, type, item->getUUID()); 196 gIMMgr->addSession(name, type, item->getUUID());
195 197
196 make_ui_sound("UISndStartIM"); 198 make_ui_sound("UISndStartIM");
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp
index d4ffe22..163c1ec 100644
--- a/linden/indra/newview/llfloaterregioninfo.cpp
+++ b/linden/indra/newview/llfloaterregioninfo.cpp
@@ -362,13 +362,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
362 panel->childSetValue("object_bonus_spin", LLSD(object_bonus_factor) ); 362 panel->childSetValue("object_bonus_spin", LLSD(object_bonus_factor) );
363 panel->childSetValue("access_combo", LLSD(sim_access) ); 363 panel->childSetValue("access_combo", LLSD(sim_access) );
364 364
365 365 panel->childSetEnabled("access_combo", gAgent.isGodlike() || (region && region->canManageEstate() ));
366 // detect teen grid for maturity
367
368 U32 parent_estate_id;
369 msg->getU32("RegionInfo", "ParentEstateID", parent_estate_id);
370 BOOL teen_grid = (parent_estate_id == 5); // *TODO add field to estate table and test that
371 panel->childSetEnabled("access_combo", gAgent.isGodlike() || (region && region->canManageEstate() && !teen_grid));
372 panel->setCtrlsEnabled(allow_modify); 366 panel->setCtrlsEnabled(allow_modify);
373 367
374 // RegionSettings PANEL 368 // RegionSettings PANEL
@@ -1650,16 +1644,9 @@ void LLPanelEstateInfo::onClickAddAllowedGroup(void* user_data)
1650 return; 1644 return;
1651 } 1645 }
1652 1646
1653 LLNotification::Params params("ChangeLindenAccess"); 1647 LLNotification::Params params("PfftLindenCrap");
1654 params.functor(boost::bind(&LLPanelEstateInfo::addAllowedGroup, self, _1, _2)); 1648 params.functor(boost::bind(&LLPanelEstateInfo::addAllowedGroup, self, _1, _2));
1655 if (isLindenEstate()) 1649 LLNotifications::instance().forceResponse(params, 0);
1656 {
1657 LLNotifications::instance().add(params);
1658 }
1659 else
1660 {
1661 LLNotifications::instance().forceResponse(params, 0);
1662 }
1663} 1650}
1664 1651
1665bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response) 1652bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response)
@@ -1837,16 +1824,6 @@ std::string all_estates_text()
1837 } 1824 }
1838} 1825}
1839 1826
1840// static
1841bool LLPanelEstateInfo::isLindenEstate()
1842{
1843 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
1844 if (!panel) return false;
1845
1846 U32 estate_id = panel->getEstateID();
1847 return (estate_id <= ESTATE_LAST_LINDEN);
1848}
1849
1850typedef std::vector<LLUUID> AgentOrGroupIDsVector; 1827typedef std::vector<LLUUID> AgentOrGroupIDsVector;
1851struct LLEstateAccessChangeInfo 1828struct LLEstateAccessChangeInfo
1852{ 1829{
@@ -1898,14 +1875,7 @@ void LLPanelEstateInfo::addAllowedGroup2(LLUUID id, void* user_data)
1898 params.payload(payload) 1875 params.payload(payload)
1899 .substitutions(args) 1876 .substitutions(args)
1900 .functor(accessCoreConfirm); 1877 .functor(accessCoreConfirm);
1901 if (isLindenEstate()) 1878 LLNotifications::instance().add(params);
1902 {
1903 LLNotifications::instance().forceResponse(params, 0);
1904 }
1905 else
1906 {
1907 LLNotifications::instance().add(params);
1908 }
1909} 1879}
1910 1880
1911// static 1881// static
@@ -1916,19 +1886,12 @@ void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dia
1916 payload["dialog_name"] = dialog_name; 1886 payload["dialog_name"] = dialog_name;
1917 // agent id filled in after avatar picker 1887 // agent id filled in after avatar picker
1918 1888
1919 LLNotification::Params params("ChangeLindenAccess"); 1889 LLNotification::Params params("PfftLindenCrap");
1920 params.payload(payload) 1890 params.payload(payload)
1921 .functor(accessAddCore2); 1891 .functor(accessAddCore2);
1922 1892
1923 if (isLindenEstate()) 1893 // same as clicking "OK"
1924 { 1894 LLNotifications::instance().forceResponse(params, 0);
1925 LLNotifications::instance().add(params);
1926 }
1927 else
1928 {
1929 // same as clicking "OK"
1930 LLNotifications::instance().forceResponse(params, 0);
1931 }
1932} 1895}
1933 1896
1934// static 1897// static
@@ -2008,16 +1971,8 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co
2008 .payload(change_info->asLLSD()) 1971 .payload(change_info->asLLSD())
2009 .functor(accessCoreConfirm); 1972 .functor(accessCoreConfirm);
2010 1973
2011 if (isLindenEstate()) 1974 // ask if this estate or all estates with this owner
2012 { 1975 LLNotifications::instance().add(params);
2013 // just apply to this estate
2014 LLNotifications::instance().forceResponse(params, 0);
2015 }
2016 else
2017 {
2018 // ask if this estate or all estates with this owner
2019 LLNotifications::instance().add(params);
2020 }
2021} 1976}
2022 1977
2023// static 1978// static
@@ -2044,20 +1999,12 @@ void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string&
2044 payload["allowed_ids"].append(item->getUUID()); 1999 payload["allowed_ids"].append(item->getUUID());
2045 } 2000 }
2046 2001
2047 LLNotification::Params params("ChangeLindenAccess"); 2002 LLNotification::Params params("PfftLindenCrap");
2048 params.payload(payload) 2003 params.payload(payload)
2049 .functor(accessRemoveCore2); 2004 .functor(accessRemoveCore2);
2050 2005
2051 if (isLindenEstate()) 2006 // just proceed, as if clicking OK
2052 { 2007 LLNotifications::instance().forceResponse(params, 0);
2053 // warn on change linden estate
2054 LLNotifications::instance().add(params);
2055 }
2056 else
2057 {
2058 // just proceed, as if clicking OK
2059 LLNotifications::instance().forceResponse(params, 0);
2060 }
2061} 2008}
2062 2009
2063// static 2010// static
@@ -2070,21 +2017,12 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&
2070 return false; 2017 return false;
2071 } 2018 }
2072 2019
2073 // If Linden estate, can only apply to "this" estate, not all estates 2020 LLSD args;
2074 // owned by NULL. 2021 args["ALL_ESTATES"] = all_estates_text();
2075 if (isLindenEstate()) 2022 LLNotifications::instance().add(notification["payload"]["dialog_name"],
2076 { 2023 args,
2077 accessCoreConfirm(notification, response); 2024 notification["payload"],
2078 } 2025 accessCoreConfirm);
2079 else
2080 {
2081 LLSD args;
2082 args["ALL_ESTATES"] = all_estates_text();
2083 LLNotifications::instance().add(notification["payload"]["dialog_name"],
2084 args,
2085 notification["payload"],
2086 accessCoreConfirm);
2087 }
2088 return false; 2026 return false;
2089} 2027}
2090 2028
@@ -2366,52 +2304,23 @@ BOOL LLPanelEstateInfo::sendUpdate()
2366{ 2304{
2367 llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl; 2305 llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
2368 2306
2369 LLNotification::Params params("ChangeLindenEstate"); 2307 // send the update
2370 params.functor(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); 2308 if (!commitEstateInfoCaps())
2371
2372 if (getEstateID() <= ESTATE_LAST_LINDEN)
2373 {
2374 // trying to change reserved estate, warn
2375 LLNotifications::instance().add(params);
2376 }
2377 else
2378 { 2309 {
2379 // for normal estates, just make the change 2310 // the caps method failed, try the old way
2380 LLNotifications::instance().forceResponse(params, 0); 2311 LLFloaterRegionInfo::nextInvoice();
2312 commitEstateInfoDataserver();
2381 } 2313 }
2314 // we don't want to do this because we'll get it automatically from the sim
2315 // after the spaceserver processes it
2316// else
2317// {
2318// // caps method does not automatically send this info
2319// LLFloaterRegionInfo::requestRegionInfo();
2320// }
2382 return TRUE; 2321 return TRUE;
2383} 2322}
2384 2323
2385bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response)
2386{
2387 S32 option = LLNotification::getSelectedOption(notification, response);
2388 switch(option)
2389 {
2390 case 0:
2391 // send the update
2392 if (!commitEstateInfoCaps())
2393 {
2394 // the caps method failed, try the old way
2395 LLFloaterRegionInfo::nextInvoice();
2396 commitEstateInfoDataserver();
2397 }
2398 // we don't want to do this because we'll get it automatically from the sim
2399 // after the spaceserver processes it
2400// else
2401// {
2402// // caps method does not automatically send this info
2403// LLFloaterRegionInfo::requestRegionInfo();
2404// }
2405 break;
2406 case 1:
2407 default:
2408 // do nothing
2409 break;
2410 }
2411 return false;
2412}
2413
2414
2415/* 2324/*
2416// Request = "getowner" 2325// Request = "getowner"
2417// SParam[0] = "" (empty string) 2326// SParam[0] = "" (empty string)
@@ -2664,47 +2573,6 @@ void LLPanelEstateInfo::setAbuseEmailAddress(const std::string& address)
2664 childSetValue("abuse_email_address", LLSD(address)); 2573 childSetValue("abuse_email_address", LLSD(address));
2665} 2574}
2666 2575
2667void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
2668 bool enable_group,
2669 bool enable_ban)
2670{
2671 childSetEnabled("allow_resident_label", enable_agent);
2672 childSetEnabled("allowed_avatar_name_list", enable_agent);
2673 childSetVisible("allowed_avatar_name_list", enable_agent);
2674 childSetEnabled("add_allowed_avatar_btn", enable_agent);
2675 childSetEnabled("remove_allowed_avatar_btn", enable_agent);
2676
2677 // Groups
2678 childSetEnabled("allow_group_label", enable_group);
2679 childSetEnabled("allowed_group_name_list", enable_group);
2680 childSetVisible("allowed_group_name_list", enable_group);
2681 childSetEnabled("add_allowed_group_btn", enable_group);
2682 childSetEnabled("remove_allowed_group_btn", enable_group);
2683
2684 // Ban
2685 childSetEnabled("ban_resident_label", enable_ban);
2686 childSetEnabled("banned_avatar_name_list", enable_ban);
2687 childSetVisible("banned_avatar_name_list", enable_ban);
2688 childSetEnabled("add_banned_avatar_btn", enable_ban);
2689 childSetEnabled("remove_banned_avatar_btn", enable_ban);
2690
2691 // Update removal buttons if needed
2692 if (enable_agent)
2693 {
2694 checkRemovalButton("allowed_avatar_name_list");
2695 }
2696
2697 if (enable_group)
2698 {
2699 checkRemovalButton("allowed_group_name_list");
2700 }
2701
2702 if (enable_ban)
2703 {
2704 checkRemovalButton("banned_avatar_name_list");
2705 }
2706}
2707
2708// static 2576// static
2709void LLPanelEstateInfo::callbackCacheName( 2577void LLPanelEstateInfo::callbackCacheName(
2710 const LLUUID& id, 2578 const LLUUID& id,
@@ -3241,20 +3109,6 @@ bool LLDispatchEstateUpdateInfo::operator()(
3241 panel->setSunHour(sun_hour); 3109 panel->setSunHour(sun_hour);
3242 } 3110 }
3243 3111
3244 bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
3245 bool god = gAgent.isGodlike();
3246 bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
3247
3248 // If visible from mainland, disable the access allowed
3249 // UI, as anyone can teleport there.
3250 // However, gods need to be able to edit the access list for
3251 // linden estates, regardless of visibility, to allow object
3252 // and L$ transfers.
3253 bool enable_agent = (!visible_from_mainland || (god && linden_estate));
3254 bool enable_group = enable_agent;
3255 bool enable_ban = !linden_estate;
3256 panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
3257
3258 return true; 3112 return true;
3259} 3113}
3260 3114
diff --git a/linden/indra/newview/llfloaterregioninfo.h b/linden/indra/newview/llfloaterregioninfo.h
index ae0c993..f5e3d03 100644
--- a/linden/indra/newview/llfloaterregioninfo.h
+++ b/linden/indra/newview/llfloaterregioninfo.h
@@ -344,7 +344,6 @@ public:
344 344
345 U32 getEstateID() const { return mEstateID; } 345 U32 getEstateID() const { return mEstateID; }
346 void setEstateID(U32 estate_id) { mEstateID = estate_id; } 346 void setEstateID(U32 estate_id) { mEstateID = estate_id; }
347 static bool isLindenEstate();
348 347
349 const std::string getOwnerName() const; 348 const std::string getOwnerName() const;
350 void setOwnerName(const std::string& name); 349 void setOwnerName(const std::string& name);
@@ -352,10 +351,6 @@ public:
352 const std::string getAbuseEmailAddress() const; 351 const std::string getAbuseEmailAddress() const;
353 void setAbuseEmailAddress(const std::string& address); 352 void setAbuseEmailAddress(const std::string& address);
354 353
355 // If visible from mainland, allowed agent and allowed groups
356 // are ignored, so must disable UI.
357 void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
358
359 // this must have the same function signature as 354 // this must have the same function signature as
360 // llmessage/llcachename.h:LLCacheNameCallback 355 // llmessage/llcachename.h:LLCacheNameCallback
361 static void callbackCacheName( 356 static void callbackCacheName(
@@ -367,8 +362,6 @@ public:
367 362
368protected: 363protected:
369 virtual BOOL sendUpdate(); 364 virtual BOOL sendUpdate();
370 // confirmation dialog callback
371 bool callbackChangeLindenEstate(const LLSD& notification, const LLSD& response);
372 365
373 void commitEstateInfoDataserver(); 366 void commitEstateInfoDataserver();
374 bool commitEstateInfoCaps(); 367 bool commitEstateInfoCaps();
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index 0cb35e3..2aed361 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -1259,7 +1259,9 @@ void LLFloaterTools::onClickLink(void* data)
1259 } 1259 }
1260 1260
1261 S32 max_linked_prims = 0; 1261 S32 max_linked_prims = 0;
1262 if(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()->usePhysics()) 1262
1263 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
1264 if(object && object->usePhysics())
1263 { 1265 {
1264 //Physical - use phys prim limit 1266 //Physical - use phys prim limit
1265 max_linked_prims = gHippoLimits->getMaxPhysLinkedPrims(); 1267 max_linked_prims = gHippoLimits->getMaxPhysLinkedPrims();
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp
index 5397f89..b2f4c22 100644
--- a/linden/indra/newview/llhoverview.cpp
+++ b/linden/indra/newview/llhoverview.cpp
@@ -253,10 +253,29 @@ void LLHoverView::updateText()
253 LLNameValue* lastname = hit_object->getNVPair("LastName"); 253 LLNameValue* lastname = hit_object->getNVPair("LastName");
254 if (firstname && lastname) 254 if (firstname && lastname)
255 { 255 {
256 std::string complete_name = firstname->getString();
257 complete_name += " ";
258 complete_name += lastname->getString();
259
260 if (LLAvatarNameCache::useDisplayNames())
261 {
262 LLAvatarName avatar_name;
263 if (LLAvatarNameCache::get(hit_object->getID(), &avatar_name))
264 {
265 if (LLAvatarNameCache::useDisplayNames() == 1)
266 {
267 complete_name = avatar_name.mDisplayName;
268 }
269 else
270 {
271 complete_name = avatar_name.getNames();
272 }
273 }
274 }
256// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) 275// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
257 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) 276 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
258 { 277 {
259 line = RlvStrings::getAnonym(line.append(firstname->getString()).append(1, ' ').append(lastname->getString())); 278 line = RlvStrings::getAnonym(complete_name);
260 } 279 }
261 else 280 else
262 { 281 {
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index d1e6139..cfe3996 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -106,6 +106,8 @@ LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL;
106 106
107BOOL LLVoiceChannel::sSuspended = FALSE; 107BOOL LLVoiceChannel::sSuspended = FALSE;
108 108
109std::set<LLFloaterIMPanel*> LLFloaterIMPanel::sFloaterIMPanels;
110
109void session_starter_helper( 111void session_starter_helper(
110 const LLUUID& temp_session_id, 112 const LLUUID& temp_session_id,
111 const LLUUID& other_participant_id, 113 const LLUUID& other_participant_id,
@@ -1108,6 +1110,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(
1108 mFirstKeystrokeTimer(), 1110 mFirstKeystrokeTimer(),
1109 mLastKeystrokeTimer() 1111 mLastKeystrokeTimer()
1110{ 1112{
1113 sFloaterIMPanels.insert(this);
1111 init(session_label); 1114 init(session_label);
1112} 1115}
1113 1116
@@ -1149,6 +1152,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(
1149void LLFloaterIMPanel::init(const std::string& session_label) 1152void LLFloaterIMPanel::init(const std::string& session_label)
1150{ 1153{
1151 mSessionLabel = session_label; 1154 mSessionLabel = session_label;
1155 mProfileButtonEnabled = FALSE;
1152 1156
1153 std::string xml_filename; 1157 std::string xml_filename;
1154 switch(mDialog) 1158 switch(mDialog)
@@ -1211,6 +1215,10 @@ void LLFloaterIMPanel::init(const std::string& session_label)
1211 FALSE); 1215 FALSE);
1212 1216
1213 setTitle(mSessionLabel); 1217 setTitle(mSessionLabel);
1218 if (mProfileButtonEnabled)
1219 {
1220 lookupName();
1221 }
1214 1222
1215 mInputEditor->setMaxTextLength(DB_IM_MSG_STR_LEN); 1223 mInputEditor->setMaxTextLength(DB_IM_MSG_STR_LEN);
1216 // enable line history support for instant message bar 1224 // enable line history support for instant message bar
@@ -1253,9 +1261,32 @@ void LLFloaterIMPanel::init(const std::string& session_label)
1253 } 1261 }
1254} 1262}
1255 1263
1264void LLFloaterIMPanel::lookupName()
1265{
1266 LLAvatarNameCache::get(mOtherParticipantUUID, boost::bind(&LLFloaterIMPanel::onAvatarNameLookup, _1, _2, this));
1267}
1268
1269//static
1270void LLFloaterIMPanel::onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data)
1271{
1272 LLFloaterIMPanel* self = (LLFloaterIMPanel*)user_data;
1273
1274 if (self && sFloaterIMPanels.count(self) != 0)
1275 {
1276 // Always show "Display Name [Legacy Name]" for security reasons
1277 std::string title = avatar_name.getNames();
1278 if (!title.empty())
1279 {
1280 self->setTitle(title);
1281 }
1282 }
1283}
1284
1256 1285
1257LLFloaterIMPanel::~LLFloaterIMPanel() 1286LLFloaterIMPanel::~LLFloaterIMPanel()
1258{ 1287{
1288 sFloaterIMPanels.erase(this);
1289
1259 delete mSpeakers; 1290 delete mSpeakers;
1260 mSpeakers = NULL; 1291 mSpeakers = NULL;
1261 1292
@@ -1550,8 +1581,9 @@ BOOL LLFloaterIMPanel::inviteToSession(const LLDynamicArray<LLUUID>& ids)
1550 return TRUE; 1581 return TRUE;
1551} 1582}
1552 1583
1553void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4& color, bool log_to_file, const LLUUID& source, const std::string& name) 1584void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4& color, bool log_to_file, const LLUUID& source, const std::string& const_name)
1554{ 1585{
1586 std::string name = const_name;
1555 // start tab flashing when receiving im for background session from user 1587 // start tab flashing when receiving im for background session from user
1556 if (source != LLUUID::null) 1588 if (source != LLUUID::null)
1557 { 1589 {
@@ -1602,6 +1634,21 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4
1602 } 1634 }
1603 else 1635 else
1604 { 1636 {
1637 if (LLAvatarNameCache::useDisplayNames() && source != LLUUID::null)
1638 {
1639 LLAvatarName avatar_name;
1640 if (LLAvatarNameCache::get(source, &avatar_name))
1641 {
1642 if (LLAvatarNameCache::useDisplayNames() == 1)
1643 {
1644 name = avatar_name.mDisplayName;
1645 }
1646 else
1647 {
1648 name = avatar_name.getNames();
1649 }
1650 }
1651 }
1605 // Convert the name to a hotlink and add to message. 1652 // Convert the name to a hotlink and add to message.
1606 const LLStyleSP &source_style = LLStyleMap::instance().lookupAgent(source); 1653 const LLStyleSP &source_style = LLStyleMap::instance().lookupAgent(source);
1607 mHistoryEditor->appendStyledText(name,false,prepend_newline,source_style); 1654 mHistoryEditor->appendStyledText(name,false,prepend_newline,source_style);
@@ -1619,7 +1666,7 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4
1619 else 1666 else
1620 histstr = name + utf8msg; 1667 histstr = name + utf8msg;
1621 1668
1622 LLLogChat::saveHistory(getTitle(),histstr); 1669 LLLogChat::saveHistory(mSessionLabel, histstr);
1623 } 1670 }
1624 1671
1625 if (!isInVisibleChain()) 1672 if (!isInVisibleChain())
@@ -2168,6 +2215,21 @@ void LLFloaterIMPanel::sendMsg()
2168 { 2215 {
2169 std::string history_echo; 2216 std::string history_echo;
2170 gAgent.buildFullname(history_echo); 2217 gAgent.buildFullname(history_echo);
2218 if (LLAvatarNameCache::useDisplayNames())
2219 {
2220 LLAvatarName avatar_name;
2221 if (LLAvatarNameCache::get(gAgent.getID(), &avatar_name))
2222 {
2223 if (LLAvatarNameCache::useDisplayNames() == 1)
2224 {
2225 history_echo = avatar_name.mDisplayName;
2226 }
2227 else
2228 {
2229 history_echo = avatar_name.getNames();
2230 }
2231 }
2232 }
2171 2233
2172 // Look for IRC-style emotes here. 2234 // Look for IRC-style emotes here.
2173 std::string prefix = utf8_text.substr(0, 4); 2235 std::string prefix = utf8_text.substr(0, 4);
diff --git a/linden/indra/newview/llimpanel.h b/linden/indra/newview/llimpanel.h
index ddcbdc7..b5a0165 100644
--- a/linden/indra/newview/llimpanel.h
+++ b/linden/indra/newview/llimpanel.h
@@ -33,6 +33,7 @@
33#ifndef LL_IMPANEL_H 33#ifndef LL_IMPANEL_H
34#define LL_IMPANEL_H 34#define LL_IMPANEL_H
35 35
36#include "llavatarnamecache.h"
36#include "llfloater.h" 37#include "llfloater.h"
37#include "lllogchat.h" 38#include "lllogchat.h"
38#include "lluuid.h" 39#include "lluuid.h"
@@ -194,6 +195,9 @@ public:
194 EInstantMessage dialog); 195 EInstantMessage dialog);
195 virtual ~LLFloaterIMPanel(); 196 virtual ~LLFloaterIMPanel();
196 197
198 void lookupName();
199 static void onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data);
200
197 /*virtual*/ BOOL postBuild(); 201 /*virtual*/ BOOL postBuild();
198 202
199 // Check typing timeout timer. 203 // Check typing timeout timer.
@@ -365,6 +369,8 @@ private:
365 typedef std::map<LLUUID, LLStyleSP> styleMap; 369 typedef std::map<LLUUID, LLStyleSP> styleMap;
366 static styleMap mStyleMap; 370 static styleMap mStyleMap;
367 371
372 static std::set<LLFloaterIMPanel*> sFloaterIMPanels;
373
368 typedef enum e_im_format 374 typedef enum e_im_format
369 { 375 {
370 IM_PANEL_PLAIN, 376 IM_PANEL_PLAIN,
diff --git a/linden/indra/newview/llmanipscale.cpp b/linden/indra/newview/llmanipscale.cpp
index 268e431..b38abe4 100644
--- a/linden/indra/newview/llmanipscale.cpp
+++ b/linden/indra/newview/llmanipscale.cpp
@@ -1523,7 +1523,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
1523 F32 max_subdivisions = sGridMaxSubdivisionLevel; 1523 F32 max_subdivisions = sGridMaxSubdivisionLevel;
1524 F32 grid_alpha = gSavedSettings.getF32("GridOpacity"); 1524 F32 grid_alpha = gSavedSettings.getF32("GridOpacity");
1525 1525
1526 F32 max_point_on_scale_line = partToMaxScale(mManipPart, bbox); 1526 F32 max_point_on_scale_line = llmin(partToMaxScale(mManipPart, bbox), LLWorld::getInstance()->getRegionWidthInMeters());
1527 LLVector3 drag_point = gAgent.getPosAgentFromGlobal(mDragPointGlobal); 1527 LLVector3 drag_point = gAgent.getPosAgentFromGlobal(mDragPointGlobal);
1528 1528
1529 updateGridSettings(); 1529 updateGridSettings();
diff --git a/linden/indra/newview/llnamelistctrl.cpp b/linden/indra/newview/llnamelistctrl.cpp
index e445df5..e30c129 100644
--- a/linden/indra/newview/llnamelistctrl.cpp
+++ b/linden/indra/newview/llnamelistctrl.cpp
@@ -39,6 +39,7 @@
39#include "llcachename.h" 39#include "llcachename.h"
40#include "llagent.h" 40#include "llagent.h"
41#include "llinventory.h" 41#include "llinventory.h"
42#include "llviewercontrol.h"
42 43
43static LLRegisterWidget<LLNameListCtrl> r("name_list"); 44static LLRegisterWidget<LLNameListCtrl> r("name_list");
44 45
@@ -56,7 +57,8 @@ LLNameListCtrl::LLNameListCtrl(const std::string& name,
56: LLScrollListCtrl(name, rect, cb, userdata, allow_multiple_selection, 57: LLScrollListCtrl(name, rect, cb, userdata, allow_multiple_selection,
57 draw_border), 58 draw_border),
58 mNameColumnIndex(name_column_index), 59 mNameColumnIndex(name_column_index),
59 mAllowCallingCardDrop(FALSE) 60 mAllowCallingCardDrop(FALSE),
61 mUseDisplayNames(FALSE)
60{ 62{
61 setToolTip(tooltip); 63 setToolTip(tooltip);
62 LLNameListCtrl::sInstances.insert(this); 64 LLNameListCtrl::sInstances.insert(this);
@@ -77,7 +79,7 @@ BOOL LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
77 //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; 79 //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
78 80
79 std::string fullname; 81 std::string fullname;
80 BOOL result = gCacheName->getFullName(agent_id, fullname); 82 BOOL result = getResidentName(agent_id, fullname);
81 83
82 fullname.append(suffix); 84 fullname.append(suffix);
83 85
@@ -164,7 +166,7 @@ BOOL LLNameListCtrl::addNameItem(LLScrollListItem* item, EAddPosition pos)
164 //llinfos << "LLNameListCtrl::addNameItem " << item->getUUID() << llendl; 166 //llinfos << "LLNameListCtrl::addNameItem " << item->getUUID() << llendl;
165 167
166 std::string fullname; 168 std::string fullname;
167 BOOL result = gCacheName->getFullName(item->getUUID(), fullname); 169 BOOL result = getResidentName(item->getUUID(), fullname);
168 170
169 LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); 171 LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex);
170 ((LLScrollListText*)cell)->setText( fullname ); 172 ((LLScrollListText*)cell)->setText( fullname );
@@ -199,7 +201,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& value, EAddPosition pos
199 else // normal resident 201 else // normal resident
200 { 202 {
201 std::string name; 203 std::string name;
202 if (gCacheName->getFullName(item->getUUID(), name)) 204 if (getResidentName(item->getUUID(), name))
203 { 205 {
204 fullname = name; 206 fullname = name;
205 } 207 }
@@ -346,6 +348,12 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
346 name_list->setAllowCallingCardDrop(allow_calling_card_drop); 348 name_list->setAllowCallingCardDrop(allow_calling_card_drop);
347 } 349 }
348 350
351 BOOL use_display_names;
352 if (node->getAttributeBOOL("use_display_names", use_display_names))
353 {
354 name_list->setUseDisplayNames(use_display_names);
355 }
356
349 name_list->setScrollListParameters(node); 357 name_list->setScrollListParameters(node);
350 358
351 name_list->initFromXML(node, parent); 359 name_list->initFromXML(node, parent);
@@ -456,5 +464,31 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
456 return name_list; 464 return name_list;
457} 465}
458 466
459 467bool LLNameListCtrl::getResidentName(const LLUUID& agent_id, std::string& fullname)
460 468{
469 std::string name;
470 if (gCacheName->getFullName(agent_id, name))
471 {
472 fullname = name;
473 if (mUseDisplayNames && LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
474 {
475 LLAvatarName avatar_name;
476 if (LLAvatarNameCache::get(agent_id, &avatar_name))
477 {
478 if (LLAvatarNameCache::useDisplayNames() == 1)
479 {
480 fullname = avatar_name.mDisplayName;
481 }
482 else
483 {
484 fullname = avatar_name.getNames();
485 }
486 }
487 }
488 return true;
489 }
490 else
491 {
492 return false;
493 }
494}
diff --git a/linden/indra/newview/llnamelistctrl.h b/linden/indra/newview/llnamelistctrl.h
index beb4ede..d6cf578 100644
--- a/linden/indra/newview/llnamelistctrl.h
+++ b/linden/indra/newview/llnamelistctrl.h
@@ -84,7 +84,12 @@ public:
84 84
85 void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; } 85 void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; }
86 86
87 void setUseDisplayNames(BOOL b) { mUseDisplayNames = b; }
88
87private: 89private:
90 bool getResidentName(const LLUUID& agent_id, std::string& fullname);
91 BOOL mUseDisplayNames;
92
88 static std::set<LLNameListCtrl*> sInstances; 93 static std::set<LLNameListCtrl*> sInstances;
89 S32 mNameColumnIndex; 94 S32 mNameColumnIndex;
90 BOOL mAllowCallingCardDrop; 95 BOOL mAllowCallingCardDrop;
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index b9dc482..06257f0 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -36,6 +36,7 @@
36#include "llnetmap.h" 36#include "llnetmap.h"
37 37
38#include "indra_constants.h" 38#include "indra_constants.h"
39#include "llavatarnamecache.h"
39#include "llui.h" 40#include "llui.h"
40#include "llmath.h" // clampf() 41#include "llmath.h" // clampf()
41#include "llfocusmgr.h" 42#include "llfocusmgr.h"
@@ -640,7 +641,29 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
640 { 641 {
641 msg.assign(""); 642 msg.assign("");
642 std::string fullname; 643 std::string fullname;
643 if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, fullname)) 644 BOOL result = FALSE;
645 if (!LLAvatarNameCache::useDisplayNames())
646 {
647 result = gCacheName->getFullName(mClosestAgentToCursor, fullname);
648 }
649 else
650 {
651 LLAvatarName avatar_name;
652 if (LLAvatarNameCache::get(mClosestAgentToCursor, &avatar_name))
653 {
654 result = TRUE;
655 if (LLAvatarNameCache::useDisplayNames() == 1)
656 {
657 fullname = avatar_name.mDisplayName;
658 }
659 else
660 {
661 fullname = avatar_name.getNames(true);
662 }
663 }
664 }
665
666 if(mClosestAgentToCursor.notNull() && result)
644 { 667 {
645// msg.append(fullname); 668// msg.append(fullname);
646// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b 669// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp
index ed406e8..4e1d03e 100644
--- a/linden/indra/newview/lloverlaybar.cpp
+++ b/linden/indra/newview/lloverlaybar.cpp
@@ -38,7 +38,7 @@
38#include "lloverlaybar.h" 38#include "lloverlaybar.h"
39 39
40#include "aoremotectrl.h" 40#include "aoremotectrl.h"
41#include "llaudioengine.h" 41#include "kokuastreamingaudio.h"
42#include "llrender.h" 42#include "llrender.h"
43#include "llagent.h" 43#include "llagent.h"
44#include "llbutton.h" 44#include "llbutton.h"
@@ -438,17 +438,16 @@ void LLOverlayBar::toggleMusicPlay(void*)
438 if (gOverlayBar->mMusicState != PLAYING) 438 if (gOverlayBar->mMusicState != PLAYING)
439 { 439 {
440 gOverlayBar->mMusicState = PLAYING; // desired state 440 gOverlayBar->mMusicState = PLAYING; // desired state
441 if (gAudiop) 441 if (gAudioStream)
442 { 442 {
443 LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); 443 LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
444 if ( parcel ) 444 if ( parcel )
445 { 445 {
446 // this doesn't work properly when crossing parcel boundaries - even when the 446 // this doesn't work properly when crossing parcel boundaries - even when the
447 // stream is stopped, it doesn't return the right thing - commenting out for now. 447 // stream is stopped, it doesn't return the right thing - commenting out for now.
448 // if ( gAudiop->isInternetStreamPlaying() == 0 ) 448 // if ( gAudioStream->isInternetStreamPlaying() == 0 )
449 { 449 {
450 gAudiop->startInternetStream(parcel->getMusicURL()); 450 gAudioStream->startInternetStream(parcel->getMusicURL());
451//awfixme sTitleObserver.init(parcel->getMusicURL());
452 } 451 }
453 } 452 }
454 } 453 }
@@ -456,9 +455,9 @@ void LLOverlayBar::toggleMusicPlay(void*)
456 else 455 else
457 { 456 {
458 gOverlayBar->mMusicState = STOPPED; // desired state 457 gOverlayBar->mMusicState = STOPPED; // desired state
459 if (gAudiop) 458 if (gAudioStream)
460 { 459 {
461 gAudiop->stopInternetStream(); 460 gAudioStream->stopInternetStream();
462 } 461 }
463 } 462 }
464} 463}
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp
index e47ae2a..6b3be29 100644
--- a/linden/indra/newview/llpanelavatar.cpp
+++ b/linden/indra/newview/llpanelavatar.cpp
@@ -416,6 +416,7 @@ BOOL LLPanelAvatarWeb::postBuild(void)
416 childSetControlName("auto_load","AutoLoadWebProfiles"); 416 childSetControlName("auto_load","AutoLoadWebProfiles");
417 417
418 mWebBrowser = getChild<LLMediaCtrl>("profile_html"); 418 mWebBrowser = getChild<LLMediaCtrl>("profile_html");
419
419 mWebBrowser->addObserver(this); 420 mWebBrowser->addObserver(this);
420 421
421 // links open in internally 422 // links open in internally
@@ -490,7 +491,17 @@ void LLPanelAvatarWeb::refresh()
490 mNavigateTo = ""; 491 mNavigateTo = "";
491 } 492 }
492} 493}
494void LLPanelAvatarWeb::onVisibilityChange(BOOL new_visibility)
495{
496 LLPluginClassMedia::EPriority new_priority;
493 497
498 if (new_visibility)
499 new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
500 else
501 new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
502
503 mWebBrowser->getMediaPlugin()->setPriority(new_priority);
504}
494 505
495void LLPanelAvatarWeb::enableControls(BOOL self) 506void LLPanelAvatarWeb::enableControls(BOOL self)
496{ 507{
@@ -1346,7 +1357,33 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1346 { 1357 {
1347 name_edit->setText(name); 1358 name_edit->setText(name);
1348 } 1359 }
1360 childSetVisible("name", TRUE);
1361 }
1362 LLNameEditor* complete_name_edit = getChild<LLNameEditor>("complete_name");
1363 if (complete_name_edit)
1364 {
1365 if (LLAvatarNameCache::useDisplayNames())
1366 {
1367 LLAvatarName avatar_name;
1368 if (LLAvatarNameCache::get(avatar_id, &avatar_name))
1369 {
1370 // Always show "Display Name [Legacy Name]" for security reasons
1371 complete_name_edit->setText(avatar_name.getNames());
1372 }
1373 else
1374 {
1375 complete_name_edit->setText(name_edit->getText());
1376 LLAvatarNameCache::get(avatar_id, boost::bind(&LLPanelAvatar::completeNameCallback, _1, _2, this));
1377 }
1378 childSetVisible("name", FALSE);
1379 childSetVisible("complete_name", TRUE);
1380 }
1381 else
1382 {
1383 childSetVisible("complete_name", FALSE);
1384 }
1349 } 1385 }
1386
1350// if (avatar_changed) 1387// if (avatar_changed)
1351 { 1388 {
1352 // While we're waiting for data off the network, clear out the 1389 // While we're waiting for data off the network, clear out the
@@ -1469,6 +1506,22 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1469 } 1506 }
1470} 1507}
1471 1508
1509void LLPanelAvatar::completeNameCallback(const LLUUID& agent_id,
1510 const LLAvatarName& avatar_name,
1511 void *userdata)
1512{
1513 LLPanelAvatar* self = (LLPanelAvatar*)userdata;
1514 if (!LLAvatarNameCache::useDisplayNames() || agent_id != self->mAvatarID)
1515 {
1516 return;
1517 }
1518 LLLineEditor* complete_name_edit = self->getChild<LLLineEditor>("complete_name");
1519 if (complete_name_edit)
1520 {
1521 // Always show "Display Name [Legacy Name]" for security reasons
1522 complete_name_edit->setText(avatar_name.getNames());
1523 }
1524}
1472 1525
1473void LLPanelAvatar::resetGroupList() 1526void LLPanelAvatar::resetGroupList()
1474{ 1527{
diff --git a/linden/indra/newview/llpanelavatar.h b/linden/indra/newview/llpanelavatar.h
index b687cd8..3a90196 100644
--- a/linden/indra/newview/llpanelavatar.h
+++ b/linden/indra/newview/llpanelavatar.h
@@ -33,6 +33,7 @@
33#ifndef LL_LLPANELAVATAR_H 33#ifndef LL_LLPANELAVATAR_H
34#define LL_LLPANELAVATAR_H 34#define LL_LLPANELAVATAR_H
35 35
36#include "llavatarnamecache.h"
36#include "llpanel.h" 37#include "llpanel.h"
37#include "v3dmath.h" 38#include "v3dmath.h"
38#include "lluuid.h" 39#include "lluuid.h"
@@ -76,7 +77,6 @@ public:
76 /*virtual*/ void draw(); 77 /*virtual*/ void draw();
77 78
78 LLPanelAvatar* getPanelAvatar() const { return mPanelAvatar; } 79 LLPanelAvatar* getPanelAvatar() const { return mPanelAvatar; }
79
80 void setDataRequested(bool requested) { mDataRequested = requested; } 80 void setDataRequested(bool requested) { mDataRequested = requested; }
81 bool isDataRequested() const { return mDataRequested; } 81 bool isDataRequested() const { return mDataRequested; }
82 82
@@ -143,14 +143,15 @@ public:
143 LLPanelAvatarWeb(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar); 143 LLPanelAvatarWeb(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar);
144 /*virtual*/ ~LLPanelAvatarWeb(); 144 /*virtual*/ ~LLPanelAvatarWeb();
145 /*virtual*/ BOOL postBuild(void); 145 /*virtual*/ BOOL postBuild(void);
146
147 /*virtual*/ void refresh(); 146 /*virtual*/ void refresh();
147 /*virtual*/ void onVisibilityChange(BOOL new_visibility);
148 148
149 void enableControls(BOOL own_avatar); 149 void enableControls(BOOL own_avatar);
150 150
151 void setWebURL(std::string url); 151 void setWebURL(std::string url);
152 152
153 void load(std::string url); 153 void load(std::string url);
154
154 static void onURLKeystroke(LLLineEditor* editor, void* data); 155 static void onURLKeystroke(LLLineEditor* editor, void* data);
155 static void onCommitLoad(LLUICtrl* ctrl, void* data); 156 static void onCommitLoad(LLUICtrl* ctrl, void* data);
156 static void onCommitURL(LLUICtrl* ctrl, void* data); 157 static void onCommitURL(LLUICtrl* ctrl, void* data);
@@ -335,6 +336,9 @@ private:
335 static bool finishUnfreeze(const LLSD& notification, const LLSD& response); 336 static bool finishUnfreeze(const LLSD& notification, const LLSD& response);
336 337
337 static void showProfileCallback(S32 option, void *userdata); 338 static void showProfileCallback(S32 option, void *userdata);
339 static void completeNameCallback(const LLUUID& agent_id,
340 const LLAvatarName& avatar_name,
341 void *userdata);
338 342
339 static void* createPanelAvatar(void* data); 343 static void* createPanelAvatar(void* data);
340 static void* createFloaterAvatarInfo(void* data); 344 static void* createFloaterAvatarInfo(void* data);
diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp
index 342ffec..719a7a0 100644
--- a/linden/indra/newview/llpaneldirfind.cpp
+++ b/linden/indra/newview/llpaneldirfind.cpp
@@ -62,6 +62,7 @@
62#include "lluictrlfactory.h" 62#include "lluictrlfactory.h"
63#include "llfloaterdirectory.h" 63#include "llfloaterdirectory.h"
64#include "llpaneldirbrowser.h" 64#include "llpaneldirbrowser.h"
65#include "llpluginclassmedia.h"
65 66
66#include <boost/tokenizer.hpp> 67#include <boost/tokenizer.hpp>
67#if LL_WINDOWS 68#if LL_WINDOWS
@@ -196,10 +197,17 @@ void LLPanelDirFind::draw()
196// virtual 197// virtual
197void LLPanelDirFind::onVisibilityChange(BOOL new_visibility) 198void LLPanelDirFind::onVisibilityChange(BOOL new_visibility)
198{ 199{
200 LLPluginClassMedia::EPriority new_priority;
199 if (new_visibility) 201 if (new_visibility)
200 { 202 {
201 mFloaterDirectory->hideAllDetailPanels(); 203 mFloaterDirectory->hideAllDetailPanels();
204 new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
202 } 205 }
206 else
207 new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
208
209 mWebBrowser->getMediaPlugin()->setPriority(new_priority);
210
203 LLPanel::onVisibilityChange(new_visibility); 211 LLPanel::onVisibilityChange(new_visibility);
204} 212}
205 213
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index fc6073a..70146ce 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -98,6 +98,9 @@ BOOL LLPanelGeneral::postBuild()
98 childSetValue("mini_map_notify_chat", gSavedSettings.getBOOL("MiniMapNotifyChatRange")); 98 childSetValue("mini_map_notify_chat", gSavedSettings.getBOOL("MiniMapNotifyChatRange"));
99 childSetValue("mini_map_notify_sim", gSavedSettings.getBOOL("MiniMapNotifySimRange")); 99 childSetValue("mini_map_notify_sim", gSavedSettings.getBOOL("MiniMapNotifySimRange"));
100 100
101// mDisplayNamesUsage = gSavedSettings.getU32("DisplayNamesUsage");
102// mLegacyNamesForFriends = gSavedSettings.getBOOL("LegacyNamesForFriends");
103
101 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor")); 104 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor"));
102 105
103 childSetValue("ui_scale_slider", gSavedSettings.getF32("UIScaleFactor")); 106 childSetValue("ui_scale_slider", gSavedSettings.getF32("UIScaleFactor"));
@@ -210,6 +213,8 @@ void LLPanelGeneral::apply()
210 213
211void LLPanelGeneral::cancel() 214void LLPanelGeneral::cancel()
212{ 215{
216// gSavedSettings.setU32("DisplayNamesUsage", mDisplayNamesUsage);
217// gSavedSettings.setBOOL("LegacyNamesForFriends", mDisplayNamesUsage);
213} 218}
214 219
215// static 220// static
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h
index e85fdf8..56cc3de 100644
--- a/linden/indra/newview/llpanelgeneral.h
+++ b/linden/indra/newview/llpanelgeneral.h
@@ -51,6 +51,9 @@ private:
51 static void onClickResetUISize(void*); 51 static void onClickResetUISize(void*);
52 static void onClickGrid(void*); 52 static void onClickGrid(void*);
53 static void onLocationChanged(LLUICtrl* ctrl, void* data); 53 static void onLocationChanged(LLUICtrl* ctrl, void* data);
54
55 U32 mDisplayNamesUsage;
56 bool mLegacyNamesForFriends;
54}; 57};
55 58
56#endif 59#endif
diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp
index 6878f84..7ff25a7 100644
--- a/linden/indra/newview/llpanelgroupgeneral.cpp
+++ b/linden/indra/newview/llpanelgroupgeneral.cpp
@@ -561,9 +561,13 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
561 gIMMgr->saveIgnoreGroup(); 561 gIMMgr->saveIgnoreGroup();
562 } 562 }
563 563
564 mCtrlReceiveNotices->resetDirty(); //resetDirty() here instead of in update because this is where the settings 564 // Make sure we update the group list in our contacts list and our IMs -- MC
565 mCtrlListGroup->resetDirty(); //are actually being applied. onCommitUserOnly doesn't call updateChanged directly. 565 if (gIMMgr)
566 mCtrlReceiveChat->resetDirty(); 566 {
567 // update the talk view
568 gIMMgr->refresh();
569 }
570 gAgent.fireEvent(new LLEvent(&gAgent, "new group"), "");
567 571
568 mChanged = FALSE; 572 mChanged = FALSE;
569 573
@@ -778,21 +782,14 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
778 { 782 {
779 mCtrlReceiveNotices->setEnabled(mAllowEdit); 783 mCtrlReceiveNotices->setEnabled(mAllowEdit);
780 } 784 }
785 mCtrlReceiveNotices->resetDirty();
781 } 786 }
782 787
783 if (mCtrlReceiveChat) 788 if (mCtrlReceiveChat)
784 { 789 {
785 mCtrlReceiveChat->setVisible(is_member); 790 mCtrlReceiveChat->setVisible(is_member);
786 mCtrlReceiveChat->setEnabled(TRUE); 791 mCtrlReceiveChat->setEnabled(TRUE);
787 } 792 mCtrlReceiveChat->resetDirty();
788
789 if (mCtrlListGroup)
790 {
791 mCtrlListGroup->setVisible(is_member);
792 if (is_member)
793 {
794 mCtrlListGroup->setEnabled(mAllowEdit);
795 }
796 } 793 }
797 794
798 795
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 31647e9..9734a18 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -41,6 +41,7 @@
41#endif 41#endif
42#include "llpluginclassmediaowner.h" 42#include "llpluginclassmediaowner.h"
43#include "llviewermedia_streamingaudio.h" 43#include "llviewermedia_streamingaudio.h"
44#include "kokuastreamingaudio.h"
44#include "llaudioengine.h" 45#include "llaudioengine.h"
45 46
46#ifdef LL_FMOD 47#ifdef LL_FMOD
@@ -681,19 +682,13 @@ bool idle_startup()
681 delete gAudiop; 682 delete gAudiop;
682 gAudiop = NULL; 683 gAudiop = NULL;
683 } 684 }
684
685 if (gAudiop)
686 {
687 // if the audio engine hasn't set up its own preferred handler for streaming audio then set up the generic streaming audio implementation which uses media plugins
688 if (NULL == gAudiop->getStreamingAudioImpl())
689 {
690 LL_INFOS("AppInit") << "Using media plugins to render streaming audio" << LL_ENDL;
691 gAudiop->setStreamingAudioImpl(new LLStreamingAudio_MediaPlugins());
692 } 685 }
693 } 686 }
694 } 687
695 } 688
696 689 if (!gAudioStream)
690 gAudioStream = new KOKUAStreamingAudio(new LLStreamingAudio_MediaPlugins());
691
697 LL_INFOS("AppInit") << "Audio Engine Initialized." << LL_ENDL; 692 LL_INFOS("AppInit") << "Audio Engine Initialized." << LL_ENDL;
698 693
699 694
@@ -877,7 +872,47 @@ bool idle_startup()
877 872
878 if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState()) 873 if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
879 { 874 {
875
880 LL_DEBUGS("AppInitStartupState") << "STATE_LOGIN_CLEANUP" << LL_ENDL; 876 LL_DEBUGS("AppInitStartupState") << "STATE_LOGIN_CLEANUP" << LL_ENDL;
877
878 gDisconnected = TRUE;
879
880 std::string cmd_line_grid_choice = gSavedSettings.getString("CmdLineGridChoice");
881 std::string cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI").asString();
882 if(!cmd_line_grid_choice.empty() && cmd_line_login_uri.empty())
883 {
884 gHippoGridManager->setCurrentGrid(cmd_line_grid_choice);
885 }
886
887 gHippoGridManager->setCurrentGridAsConnected();
888 gHippoLimits->setLimits();
889
890 if (gHippoGridManager->getConnectedGrid()->isSecondLife())
891 {
892 LLStartUp::setStartupState( STATE_LECTURE_PRIVACY );
893 LLFirstUse::Privacy();
894 }
895 else
896 {
897 LLStartUp::setStartupState( STATE_PRIVACY_LECTURED );
898 }
899
900 return FALSE;
901
902 }
903
904 if (STATE_LECTURE_PRIVACY == LLStartUp::getStartupState())
905 {
906 LL_DEBUGS("AppInitStartupState") << "STATE_LECTURE_PRIVACY" << LL_ENDL;
907
908 //wait for the user to decide
909 ms_sleep(1);
910 return FALSE;
911 }
912
913 if (STATE_PRIVACY_LECTURED == LLStartUp::getStartupState())
914 {
915 LL_DEBUGS("AppInitStartupState") << "STATE_PRIVACY_LECTURED" << LL_ENDL;
881 //reset the values that could have come in from a slurl 916 //reset the values that could have come in from a slurl
882 if (!gLoginHandler.getWebLoginKey().isNull()) 917 if (!gLoginHandler.getWebLoginKey().isNull())
883 { 918 {
@@ -919,15 +954,9 @@ bool idle_startup()
919 gDebugInfo["LoginName"] = firstname + " " + lastname; 954 gDebugInfo["LoginName"] = firstname + " " + lastname;
920 } 955 }
921 956
922 std::string cmd_line_grid_choice = gSavedSettings.getString("CmdLineGridChoice");
923 std::string cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI").asString();
924 if(!cmd_line_grid_choice.empty() && cmd_line_login_uri.empty())
925 {
926 gHippoGridManager->setCurrentGrid(cmd_line_grid_choice);
927 }
928 957
929 gHippoGridManager->setCurrentGridAsConnected(); 958
930 gHippoLimits->setLimits(); 959
931 // create necessary directories 960 // create necessary directories
932 // *FIX: these mkdir's should error check 961 // *FIX: these mkdir's should error check
933 gDirUtilp->setLindenUserDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname); 962 gDirUtilp->setLindenUserDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname);
@@ -2005,6 +2034,12 @@ bool idle_startup()
2005 2034
2006 // Load stored cache if possible 2035 // Load stored cache if possible
2007 LLAppViewer::instance()->loadNameCache(); 2036 LLAppViewer::instance()->loadNameCache();
2037
2038 // Start cache in not-running state until we figure out if we have
2039 // capabilities for display name lookup
2040 LLAvatarNameCache::initClass(false);
2041 LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getU32("DisplayNamesUsage"));
2042 LLAvatarName::sOmitResidentAsLastName = (bool)gSavedSettings.getBOOL("OmitResidentAsLastName");
2008 } 2043 }
2009 2044
2010 // *Note: this is where gWorldMap used to be initialized. 2045 // *Note: this is where gWorldMap used to be initialized.
@@ -3772,6 +3807,8 @@ std::string LLStartUp::startupStateToString(EStartupState state)
3772 RTNENUM( STATE_LOGIN_SHOW ); 3807 RTNENUM( STATE_LOGIN_SHOW );
3773 RTNENUM( STATE_LOGIN_WAIT ); 3808 RTNENUM( STATE_LOGIN_WAIT );
3774 RTNENUM( STATE_LOGIN_CLEANUP ); 3809 RTNENUM( STATE_LOGIN_CLEANUP );
3810 RTNENUM( STATE_LECTURE_PRIVACY );
3811 RTNENUM( STATE_PRIVACY_LECTURED );
3775 RTNENUM( STATE_LOGIN_VOICE_LICENSE ); 3812 RTNENUM( STATE_LOGIN_VOICE_LICENSE );
3776 RTNENUM( STATE_UPDATE_CHECK ); 3813 RTNENUM( STATE_UPDATE_CHECK );
3777 RTNENUM( STATE_LOGIN_AUTH_INIT ); 3814 RTNENUM( STATE_LOGIN_AUTH_INIT );
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index 08862e6..3fe8daa 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -49,7 +49,9 @@ typedef enum {
49 STATE_BROWSER_INIT, // Initialize web browser for login screen 49 STATE_BROWSER_INIT, // Initialize web browser for login screen
50 STATE_LOGIN_SHOW, // Show login screen 50 STATE_LOGIN_SHOW, // Show login screen
51 STATE_LOGIN_WAIT, // Wait for user input at login screen 51 STATE_LOGIN_WAIT, // Wait for user input at login screen
52 STATE_LOGIN_CLEANUP, // Get rid of login screen and start login 52 STATE_LOGIN_CLEANUP, // lecture about privacy
53 STATE_LECTURE_PRIVACY, // wait until the lecture was read
54 STATE_PRIVACY_LECTURED, // Get rid of login screen and start login
53 STATE_LOGIN_VOICE_LICENSE, // Show license agreement for using voice 55 STATE_LOGIN_VOICE_LICENSE, // Show license agreement for using voice
54 STATE_UPDATE_CHECK, // Wait for user at a dialog box (updates, term-of-service, etc) 56 STATE_UPDATE_CHECK, // Wait for user at a dialog box (updates, term-of-service, etc)
55 STATE_LOGIN_AUTH_INIT, // Start login to SL servers 57 STATE_LOGIN_AUTH_INIT, // Start login to SL servers
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp
index c8e1298..ceef28b 100644
--- a/linden/indra/newview/lltexlayer.cpp
+++ b/linden/indra/newview/lltexlayer.cpp
@@ -213,6 +213,7 @@ BOOL LLTexLayerSetBuffer::needsRender()
213 LLVOAvatar* avatar = mTexLayerSet->getAvatar(); 213 LLVOAvatar* avatar = mTexLayerSet->getAvatar();
214 BOOL upload_now = needsUploadNow(); 214 BOOL upload_now = needsUploadNow();
215 BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating; 215 BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
216
216 if (needs_update) 217 if (needs_update)
217 { 218 {
218 BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT); 219 BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT);
@@ -275,16 +276,16 @@ BOOL LLTexLayerSetBuffer::render()
275 } 276 }
276 else 277 else
277 { 278 {
278 // mUploadPending = FALSE;//see... 279 //mUploadPending = FALSE;//see...
279 // mNeedsUpload = FALSE;// ...below... 280 //mNeedsUpload = FALSE;// ...below...
280 LLVOAvatar* avatar = mTexLayerSet->getAvatar(); 281 LLVOAvatar* avatar = mTexLayerSet->getAvatar();
281 if (avatar) 282 if (avatar)
282 { 283 {
283 avatar->setNewBakedTexture(avatar->getBakedTE(mTexLayerSet), IMG_INVISIBLE); 284 avatar->setNewBakedTexture(avatar->getBakedTE(mTexLayerSet), IMG_INVISIBLE);
284 llinfos << "Invisible baked texture set for " << mTexLayerSet->getBodyRegion() << llendl; 285 llinfos << "Invisible baked texture set for " << mTexLayerSet->getBodyRegion() << llendl;
285 } 286 }
286 readBackAndUpload(); //... here: Opensim is not happy if we don't 287 readBackAndUpload(); //... here: Opensim is not happy if we don't
287 //TODO: find out if SL is happy if we do 288 //TODO: find out if SL is happy if we do
288 } 289 }
289 } 290 }
290 } 291 }
@@ -350,12 +351,11 @@ void LLTexLayerSetBuffer::readBackAndUpload()
350 // writes into baked_color_data 351 // writes into baked_color_data
351 const char* comment_text = NULL; 352 const char* comment_text = NULL;
352 353
353 S32 baked_image_components = 5; // red green blue bump clothing 354 S32 baked_image_components = 5; // red green blue bump clothing
354 LLPointer<LLImageRaw> baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components ); 355 LLPointer<LLImageRaw> baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components );
355 U8* baked_image_data = baked_image->getData(); 356 U8* baked_image_data = baked_image->getData();
356 357
357 comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask 358 comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask
358
359 S32 i = 0; 359 S32 i = 0;
360 for (S32 u = 0; u < mWidth; u++) 360 for (S32 u = 0; u < mWidth; u++)
361 { 361 {
@@ -492,7 +492,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user
492 avatar->setNewBakedTexture(baked_te, uuid); 492 avatar->setNewBakedTexture(baked_te, uuid);
493 } 493 }
494 else 494 else
495 { 495 {
496 ++failures; 496 ++failures;
497 llinfos << "Baked upload failed (attempt " << failures << "/" << MAX_BAKE_UPLOAD_ATTEMPTS << "), "; 497 llinfos << "Baked upload failed (attempt " << failures << "/" << MAX_BAKE_UPLOAD_ATTEMPTS << "), ";
498 if (failures >= MAX_BAKE_UPLOAD_ATTEMPTS) 498 if (failures >= MAX_BAKE_UPLOAD_ATTEMPTS)
@@ -1412,7 +1412,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1412 1412
1413 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); 1413 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode();
1414 1414
1415 gGL.getTexUnit(0)->bind(image_gl); 1415 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1416 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); 1416 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
1417 1417
1418 gl_rect_2d_simple_tex( width, height ); 1418 gl_rect_2d_simple_tex( width, height );
@@ -1430,7 +1430,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1430 LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); 1430 LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
1431 if( image_gl ) 1431 if( image_gl )
1432 { 1432 {
1433 gGL.getTexUnit(0)->bind(image_gl); 1433 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1434 gl_rect_2d_simple_tex( width, height ); 1434 gl_rect_2d_simple_tex( width, height );
1435 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); 1435 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1436 } 1436 }
@@ -1656,7 +1656,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1656 1656
1657 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); 1657 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode();
1658 1658
1659 gGL.getTexUnit(0)->bind(image_gl); 1659 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1660 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); 1660 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
1661 1661
1662 gl_rect_2d_simple_tex( width, height ); 1662 gl_rect_2d_simple_tex( width, height );
@@ -1678,7 +1678,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1678 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) 1678 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
1679 { 1679 {
1680 LLGLSNoAlphaTest gls_no_alpha_test; 1680 LLGLSNoAlphaTest gls_no_alpha_test;
1681 gGL.getTexUnit(0)->bind(image_gl); 1681 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1682 gl_rect_2d_simple_tex( width, height ); 1682 gl_rect_2d_simple_tex( width, height );
1683 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); 1683 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1684 } 1684 }
@@ -2146,7 +2146,7 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
2146 } 2146 }
2147 2147
2148 LLGLSNoAlphaTest gls_no_alpha_test; 2148 LLGLSNoAlphaTest gls_no_alpha_test;
2149 gGL.getTexUnit(0)->bind(mCachedProcessedImageGL); 2149 gGL.getTexUnit(0)->bind(mCachedProcessedImageGL, TRUE);
2150 gl_rect_2d_simple_tex( width, height ); 2150 gl_rect_2d_simple_tex( width, height );
2151 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); 2151 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2152 stop_glerror(); 2152 stop_glerror();
diff --git a/linden/indra/newview/lltexturecache.cpp b/linden/indra/newview/lltexturecache.cpp
index 4679137..2e7d585 100644
--- a/linden/indra/newview/lltexturecache.cpp
+++ b/linden/indra/newview/lltexturecache.cpp
@@ -736,9 +736,6 @@ void LLTextureCacheWorker::endWork(S32 param, bool aborted)
736 736
737LLTextureCache::LLTextureCache(bool threaded) 737LLTextureCache::LLTextureCache(bool threaded)
738 : LLWorkerThread("TextureCache", threaded), 738 : LLWorkerThread("TextureCache", threaded),
739 mWorkersMutex(NULL),
740 mHeaderMutex(NULL),
741 mListMutex(NULL),
742 mHeaderAPRFile(NULL), 739 mHeaderAPRFile(NULL),
743 mReadOnly(FALSE), 740 mReadOnly(FALSE),
744 mTexturesSizeTotal(0), 741 mTexturesSizeTotal(0),
@@ -1543,7 +1540,7 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
1543 } 1540 }
1544 } 1541 }
1545 1542
1546 unlockWorkers(); 1543 unlockWorkers();
1547 1544
1548 if (delete_worker) worker->scheduleDelete(); 1545 if (delete_worker) worker->scheduleDelete();
1549 1546
diff --git a/linden/indra/newview/lltexturecache.h b/linden/indra/newview/lltexturecache.h
index c859b9a..56b4c4f 100644
--- a/linden/indra/newview/lltexturecache.h
+++ b/linden/indra/newview/lltexturecache.h
@@ -139,9 +139,6 @@ protected:
139 std::string getTextureFileName(const LLUUID& id); 139 std::string getTextureFileName(const LLUUID& id);
140 void addCompleted(Responder* responder, bool success); 140 void addCompleted(Responder* responder, bool success);
141 141
142protected:
143 //void setFileAPRPool(apr_pool_t* pool) { mFileAPRPool = pool ; }
144
145private: 142private:
146 void setDirNames(ELLPath location); 143 void setDirNames(ELLPath location);
147 void readHeaderCache(); 144 void readHeaderCache();
diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp
index f93a574..072af25 100644
--- a/linden/indra/newview/lltexturefetch.cpp
+++ b/linden/indra/newview/lltexturefetch.cpp
@@ -428,7 +428,6 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
428 mRetryAttempt(0), 428 mRetryAttempt(0),
429 mActiveCount(0), 429 mActiveCount(0),
430 mGetStatus(0), 430 mGetStatus(0),
431 mWorkMutex(NULL),
432 mFirstPacket(0), 431 mFirstPacket(0),
433 mLastPacket(-1), 432 mLastPacket(-1),
434 mTotalPackets(0), 433 mTotalPackets(0),
@@ -1540,8 +1539,6 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
1540 mDebugPause(FALSE), 1539 mDebugPause(FALSE),
1541 mPacketCount(0), 1540 mPacketCount(0),
1542 mBadPacketCount(0), 1541 mBadPacketCount(0),
1543 mQueueMutex(getAPRPool()),
1544 mNetworkQueueMutex(getAPRPool()),
1545 mTextureCache(cache), 1542 mTextureCache(cache),
1546 mImageDecodeThread(imagedecodethread), 1543 mImageDecodeThread(imagedecodethread),
1547 mTextureBandwidth(0), 1544 mTextureBandwidth(0),
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index 296d1bb..34735a3 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -645,8 +645,6 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
645 } 645 }
646 */ 646 */
647 647
648
649 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
650 648
651 LLViewerObject *object = NULL; 649 LLViewerObject *object = NULL;
652 LLViewerObject *parent = NULL; 650 LLViewerObject *parent = NULL;
@@ -697,9 +695,14 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
697 { 695 {
698 gViewerWindow->getWindow()->setCursor(UI_CURSOR_HAND); 696 gViewerWindow->getWindow()->setCursor(UI_CURSOR_HAND);
699 } 697 }
698 else
699 {
700 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
701 }
700 } 702 }
701 else 703 else
702 { 704 {
705 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
703 // We need to clear media hover flag 706 // We need to clear media hover flag
704 if (LLViewerMediaFocus::getInstance()->getMouseOverFlag()) 707 if (LLViewerMediaFocus::getInstance()->getMouseOverFlag())
705 { 708 {
diff --git a/linden/indra/newview/llvieweraudio.cpp b/linden/indra/newview/llvieweraudio.cpp
index 91e7ce5..d465177 100644
--- a/linden/indra/newview/llvieweraudio.cpp
+++ b/linden/indra/newview/llvieweraudio.cpp
@@ -33,6 +33,7 @@
33#include "llviewerprecompiledheaders.h" 33#include "llviewerprecompiledheaders.h"
34 34
35#include "llaudioengine.h" 35#include "llaudioengine.h"
36#include "kokuastreamingaudio.h"
36#include "llagent.h" 37#include "llagent.h"
37#include "llappviewer.h" 38#include "llappviewer.h"
38#include "llvieweraudio.h" 39#include "llvieweraudio.h"
@@ -46,69 +47,71 @@
46 47
47void init_audio() 48void init_audio()
48{ 49{
49 if (!gAudiop) 50 if (gAudiop)
50 { 51 {
51 llwarns << "Failed to create an appropriate Audio Engine" << llendl; 52 LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
52 return; 53 LLVector3 lpos_global_f;
54
55 lpos_global_f.setVec(lpos_global);
56
57 gAudiop->setListener(lpos_global_f,
58 LLVector3::zero, // LLViewerCamera::getInstance()->getVelocity(), // !!! BUG need to replace this with smoothed velocity!
59 LLViewerCamera::getInstance()->getUpAxis(),
60 LLViewerCamera::getInstance()->getAtAxis());
61
62 // load up our initial set of sounds we'll want so they're in memory and ready to be played
63
64 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
65
66 if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))
67 {
68 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));
69 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke")));
70 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject")));
71 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick")));
72 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease")));
73 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF")));
74 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM")));
75 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat")));
76 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM")));
77 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject")));
78 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp")));
79 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv")));
80 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown")));
81 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp")));
82 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv")));
83 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate")));
84 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
85 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
86 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
87 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
88 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
89 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
90 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
91 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
92 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
93 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
94 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
95 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
96 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
97 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
98 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
99 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
100 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM")));
101 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot")));
102 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut")));
103 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject")));
104 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv")));
105 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
106 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
107 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
108 }
53 } 109 }
54 LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); 110 else
55 LLVector3 lpos_global_f;
56
57 lpos_global_f.setVec(lpos_global);
58
59 gAudiop->setListener(lpos_global_f,
60 LLVector3::zero, // LLViewerCamera::getInstance()->getVelocity(), // !!! BUG need to replace this with smoothed velocity!
61 LLViewerCamera::getInstance()->getUpAxis(),
62 LLViewerCamera::getInstance()->getAtAxis());
63
64// load up our initial set of sounds we'll want so they're in memory and ready to be played
65
66 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
67
68 if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))
69 { 111 {
70 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); 112 llwarns << "Failed to create an appropriate Audio Engine" << llendl;
71 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); 113 return;
72 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject")));
73 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick")));
74 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease")));
75 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF")));
76 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM")));
77 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat")));
78 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM")));
79 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject")));
80 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp")));
81 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv")));
82 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown")));
83 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp")));
84 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv")));
85 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate")));
86 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
87 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
88 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
89 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
90 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
91 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
92 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
93 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
94 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
95 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
96 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
97 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
98 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
99 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
100 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
101 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
102 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM")));
103 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot")));
104 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut")));
105 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject")));
106 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv")));
107 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
108 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
109 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
110 } 114 }
111
112 audio_update_volume(true); 115 audio_update_volume(true);
113} 116}
114 117
@@ -158,12 +161,12 @@ void audio_update_volume(bool force_update)
158 } 161 }
159 162
160 // Streaming Music 163 // Streaming Music
161 if (gAudiop) 164 if (gAudioStream)
162 { 165 {
163 F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); 166 F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
164 BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); 167 BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");
165 music_volume = mute_volume * master_volume * (music_volume*music_volume); 168 music_volume = mute_volume * master_volume * (music_volume*music_volume);
166 gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume ); 169 gAudioStream->setInternetStreamGain ( music_muted ? 0.f : music_volume );
167 170
168 } 171 }
169 172
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index 3675072..572f64a 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -38,8 +38,11 @@
38#include "indra_constants.h" 38#include "indra_constants.h"
39 39
40// For Listeners 40// For Listeners
41#include "llaudioengine.h" 41// #include "llaudioengine.h"
42#include "kokuastreamingaudio.h"
42#include "llagent.h" 43#include "llagent.h"
44#include "llavatarnamecache.h"
45#include "llcallingcard.h"
43#include "llconsole.h" 46#include "llconsole.h"
44#include "lldrawpoolterrain.h" 47#include "lldrawpoolterrain.h"
45#include "llflexibleobject.h" 48#include "llflexibleobject.h"
@@ -310,7 +313,7 @@ static bool handleJoystickChanged(const LLSD& newvalue)
310 313
311static bool handleAudioStreamMusicChanged(const LLSD& newvalue) 314static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
312{ 315{
313 if (gAudiop) 316 if (gAudioStream)
314 { 317 {
315 if ( newvalue.asBoolean() ) 318 if ( newvalue.asBoolean() )
316 { 319 {
@@ -319,15 +322,15 @@ static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
319 { 322 {
320 // if stream is already playing, don't call this 323 // if stream is already playing, don't call this
321 // otherwise music will briefly stop 324 // otherwise music will briefly stop
322 if ( !gAudiop->isInternetStreamPlaying() ) 325 if ( !gAudioStream->isInternetStreamPlaying() )
323 { 326 {
324 gAudiop->startInternetStream(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL()); 327 gAudioStream->startInternetStream(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL());
325 } 328 }
326 } 329 }
327 } 330 }
328 else 331 else
329 { 332 {
330 gAudiop->stopInternetStream(); 333 gAudioStream->stopInternetStream();
331 } 334 }
332 } 335 }
333 return true; 336 return true;
@@ -425,6 +428,28 @@ static bool handleAuditTextureChanged(const LLSD& newvalue)
425 return true; 428 return true;
426} 429}
427 430
431static bool handleDisplayNamesUsageChanged(const LLSD& newvalue)
432{
433 LLAvatarNameCache::setUseDisplayNames((U32)newvalue.asInteger());
434 LLVOAvatar::invalidateNameTags();
435 LLAvatarTracker::instance().dirtyBuddies();
436 return true;
437}
438
439static bool handleOmitResidentAsLastNameChanged(const LLSD& newvalue)
440{
441 LLAvatarName::sOmitResidentAsLastName =(bool)newvalue.asBoolean();
442 LLVOAvatar::invalidateNameTags();
443 LLAvatarTracker::instance().dirtyBuddies();
444 return true;
445}
446
447static bool handleLegacyNamesForFriendsChanged(const LLSD& newvalue)
448{
449 LLAvatarTracker::instance().dirtyBuddies();
450 return true;
451}
452
428static bool handleRenderDebugGLChanged(const LLSD& newvalue) 453static bool handleRenderDebugGLChanged(const LLSD& newvalue)
429{ 454{
430 gDebugGL = newvalue.asBoolean(); 455 gDebugGL = newvalue.asBoolean();
@@ -572,6 +597,9 @@ void settings_setup_listeners()
572 gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 597 gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
573 gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _1)); 598 gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _1));
574 gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _1)); 599 gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _1));
600 gSavedSettings.getControl("DisplayNamesUsage")->getSignal()->connect(boost::bind(&handleDisplayNamesUsageChanged, _1));
601 gSavedSettings.getControl("OmitResidentAsLastName")->getSignal()->connect(boost::bind(&handleOmitResidentAsLastNameChanged, _1));
602 gSavedSettings.getControl("LegacyNamesForFriends")->getSignal()->connect(boost::bind(&handleLegacyNamesForFriendsChanged, _1));
575 gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 603 gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
576 gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 604 gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
577 gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 605 gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
diff --git a/linden/indra/newview/llviewerdisplayname.cpp b/linden/indra/newview/llviewerdisplayname.cpp
new file mode 100644
index 0000000..6a7cab3
--- /dev/null
+++ b/linden/indra/newview/llviewerdisplayname.cpp
@@ -0,0 +1,208 @@
1/**
2 * @file llviewerdisplayname.cpp
3 * @brief Wrapper for display name functionality
4 *
5 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
6 * Second Life Viewer Source Code
7 * Copyright (C) 2010, Linden Research, Inc.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation;
12 * version 2.1 of the License only.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
24 * $/LicenseInfo$
25 */
26
27#include "llviewerprecompiledheaders.h"
28
29#include "llviewerdisplayname.h"
30
31// viewer includes
32#include "llagent.h"
33#include "llviewerregion.h"
34#include "llvoavatar.h"
35
36// library includes
37#include "llavatarnamecache.h"
38#include "llhttpclient.h"
39#include "llhttpnode.h"
40#include "llnotifications.h"
41#include "llui.h" // getLanguage()
42
43namespace LLViewerDisplayName
44{
45 // Fired when viewer receives server response to display name change
46 set_name_signal_t sSetDisplayNameSignal;
47
48 // Fired when there is a change in the agent's name
49 name_changed_signal_t sNameChangedSignal;
50
51 void addNameChangedCallback(const name_changed_signal_t::slot_type& cb)
52 {
53 sNameChangedSignal.connect(cb);
54 }
55
56}
57
58class LLSetDisplayNameResponder : public LLHTTPClient::Responder
59{
60public:
61 // only care about errors
62 /*virtual*/ void error(U32 status, const std::string& reason)
63 {
64 LLViewerDisplayName::sSetDisplayNameSignal(false, "", LLSD());
65 LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots();
66 }
67};
68
69void LLViewerDisplayName::set(const std::string& display_name, const set_name_slot_t& slot)
70{
71 // TODO: simple validation here
72
73 LLViewerRegion* region = gAgent.getRegion();
74 llassert(region);
75 std::string cap_url = region->getCapability("SetDisplayName");
76 if (cap_url.empty())
77 {
78 // this server does not support display names, report error
79 slot(false, "unsupported", LLSD());
80 return;
81 }
82
83 // People API can return localized error messages. Indicate our
84 // language preference via header.
85 LLSD headers;
86 headers["Accept-Language"] = LLUI::getLanguage();
87
88 // People API requires both the old and new value to change a variable.
89 // Our display name will be in cache before the viewer's UI is available
90 // to request a change, so we can use direct lookup without callback.
91 LLAvatarName av_name;
92 if (!LLAvatarNameCache::get( gAgent.getID(), &av_name))
93 {
94 slot(false, "name unavailable", LLSD());
95 return;
96 }
97
98 // People API expects array of [ "old value", "new value" ]
99 LLSD change_array = LLSD::emptyArray();
100 change_array.append(av_name.mDisplayName);
101 change_array.append(display_name);
102
103 llinfos << "Set name POST to " << cap_url << llendl;
104
105 // Record our caller for when the server sends back a reply
106 sSetDisplayNameSignal.connect(slot);
107
108 // POST the requested change. The sim will not send a response back to
109 // this request directly, rather it will send a separate message after it
110 // communicates with the back-end.
111 LLSD body;
112 body["display_name"] = change_array;
113 LLHTTPClient::post(cap_url, body, new LLSetDisplayNameResponder, headers);
114}
115
116class LLSetDisplayNameReply : public LLHTTPNode
117{
118 LOG_CLASS(LLSetDisplayNameReply);
119public:
120 /*virtual*/ void post(
121 LLHTTPNode::ResponsePtr response,
122 const LLSD& context,
123 const LLSD& input) const
124 {
125 LLSD body = input["body"];
126
127 S32 status = body["status"].asInteger();
128 bool success = (status == 200);
129 std::string reason = body["reason"].asString();
130 LLSD content = body["content"];
131
132 llinfos << "status " << status << " reason " << reason << llendl;
133
134 // If viewer's concept of display name is out-of-date, the set request
135 // will fail with 409 Conflict. If that happens, fetch up-to-date
136 // name information.
137 if (status == 409)
138 {
139 LLUUID agent_id = gAgent.getID();
140 // Flush stale data
141 LLAvatarNameCache::erase( agent_id );
142 // Queue request for new data
143 LLAvatarName ignored;
144 LLAvatarNameCache::get( agent_id, &ignored );
145 // Kill name tag, as it is wrong
146 LLVOAvatar::invalidateNameTag( agent_id );
147 }
148
149 // inform caller of result
150 LLViewerDisplayName::sSetDisplayNameSignal(success, reason, content);
151 LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots();
152 }
153};
154
155
156class LLDisplayNameUpdate : public LLHTTPNode
157{
158 /*virtual*/ void post(
159 LLHTTPNode::ResponsePtr response,
160 const LLSD& context,
161 const LLSD& input) const
162 {
163 LLSD body = input["body"];
164 LLUUID agent_id = body["agent_id"];
165 std::string old_display_name = body["old_display_name"];
166 // By convention this record is called "agent" in the People API
167 LLSD name_data = body["agent"];
168
169 // Inject the new name data into cache
170 LLAvatarName av_name;
171 av_name.fromLLSD( name_data );
172
173 llinfos << "name-update now " << LLDate::now()
174 << " next_update " << LLDate(av_name.mNextUpdate)
175 << llendl;
176
177 // Name expiration time may be provided in headers, or we may use a
178 // default value
179 // *TODO: get actual headers out of ResponsePtr
180 //LLSD headers = response->mHeaders;
181 LLSD headers;
182 av_name.mExpires =
183 LLAvatarNameCache::nameExpirationFromHeaders(headers);
184
185 LLAvatarNameCache::insert(agent_id, av_name);
186
187 // force name tag to update
188 LLVOAvatar::invalidateNameTag(agent_id);
189
190 LLSD args;
191 args["OLD_NAME"] = old_display_name;
192 args["SLID"] = av_name.mUsername;
193 args["NEW_NAME"] = av_name.mDisplayName;
194 LLNotifications::instance().add("DisplayNameUpdate", args);
195 if (agent_id == gAgent.getID())
196 {
197 LLViewerDisplayName::sNameChangedSignal();
198 }
199 }
200};
201
202LLHTTPRegistration<LLSetDisplayNameReply>
203 gHTTPRegistrationMessageSetDisplayNameReply(
204 "/message/SetDisplayNameReply");
205
206LLHTTPRegistration<LLDisplayNameUpdate>
207 gHTTPRegistrationMessageDisplayNameUpdate(
208 "/message/DisplayNameUpdate");
diff --git a/linden/indra/newview/llviewerdisplayname.h b/linden/indra/newview/llviewerdisplayname.h
new file mode 100644
index 0000000..16d59ae
--- /dev/null
+++ b/linden/indra/newview/llviewerdisplayname.h
@@ -0,0 +1,53 @@
1/**
2 * @file llviewerdisplayname.h
3 * @brief Wrapper for display name functionality
4 *
5 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
6 * Second Life Viewer Source Code
7 * Copyright (C) 2010, Linden Research, Inc.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation;
12 * version 2.1 of the License only.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
24 * $/LicenseInfo$
25 */
26
27#ifndef LLVIEWERDISPLAYNAME_H
28#define LLVIEWERDISPLAYNAME_H
29
30#include <boost/signals2.hpp>
31
32class LLSD;
33class LLUUID;
34
35namespace LLViewerDisplayName
36{
37 typedef boost::signals2::signal<
38 void (bool success, const std::string& reason, const LLSD& content)>
39 set_name_signal_t;
40 typedef set_name_signal_t::slot_type set_name_slot_t;
41
42 typedef boost::signals2::signal<void (void)> name_changed_signal_t;
43 typedef name_changed_signal_t::slot_type name_changed_slot_t;
44
45 // Sends an update to the server to change a display name
46 // and call back when done. May not succeed due to service
47 // unavailable or name not available.
48 void set(const std::string& display_name, const set_name_slot_t& slot);
49
50 void addNameChangedCallback(const name_changed_signal_t::slot_type& cb);
51}
52
53#endif // LLVIEWERDISPLAYNAME_H
diff --git a/linden/indra/newview/llviewermedia.cpp b/linden/indra/newview/llviewermedia.cpp
index 5c01b25..f0faedf 100644
--- a/linden/indra/newview/llviewermedia.cpp
+++ b/linden/indra/newview/llviewermedia.cpp
@@ -402,7 +402,7 @@ bool LLViewerMediaImpl::initializeMedia(const std::string& mime_type)
402 { 402 {
403 if(! initializePlugin(mime_type)) 403 if(! initializePlugin(mime_type))
404 { 404 {
405 LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << mime_type << LL_ENDL; 405 LL_WARNS("PluginViewerMedia") << "plugin intialization failed for mime type: " << mime_type << LL_ENDL;
406 LLSD args; 406 LLSD args;
407 args["MIME_TYPE"] = mime_type; 407 args["MIME_TYPE"] = mime_type;
408 LLNotifications::instance().add("NoPlugin", args); 408 LLNotifications::instance().add("NoPlugin", args);
@@ -520,7 +520,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
520 } 520 }
521 } 521 }
522 522
523 LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL; 523 LL_WARNS("PluginViewerMedia") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;
524 LLSD args; 524 LLSD args;
525 args["MIME_TYPE"] = media_type; 525 args["MIME_TYPE"] = media_type;
526 LLNotifications::instance().add("NoPlugin", args); 526 LLNotifications::instance().add("NoPlugin", args);
diff --git a/linden/indra/newview/llviewermedia_streamingaudio.cpp b/linden/indra/newview/llviewermedia_streamingaudio.cpp
index 575dbc8..6a4dd0f 100644
--- a/linden/indra/newview/llviewermedia_streamingaudio.cpp
+++ b/linden/indra/newview/llviewermedia_streamingaudio.cpp
@@ -69,8 +69,13 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
69 llinfos << "mMediaPlugin is now " << mMediaPlugin << llendl; 69 llinfos << "mMediaPlugin is now " << mMediaPlugin << llendl;
70 } 70 }
71 71
72 mVersion = mMediaPlugin ? mMediaPlugin->getPluginVersion() : std::string();
73
72 if(!mMediaPlugin) 74 if(!mMediaPlugin)
75 {
76 llinfos << "mMediaPlugin failed to initialize!" << llendl;
73 return; 77 return;
78 }
74 79
75 if (!url.empty()) { 80 if (!url.empty()) {
76 llinfos << "Starting internet stream: " << url << llendl; 81 llinfos << "Starting internet stream: " << url << llendl;
@@ -156,6 +161,11 @@ std::string LLStreamingAudio_MediaPlugins::getURL()
156 return mURL; 161 return mURL;
157} 162}
158 163
164std::string LLStreamingAudio_MediaPlugins::getVersion()
165{
166 return mVersion;
167}
168
159void LLStreamingAudio_MediaPlugins::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) 169void LLStreamingAudio_MediaPlugins::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
160{ 170{
161 if (event == MEDIA_EVENT_NAME_CHANGED) 171 if (event == MEDIA_EVENT_NAME_CHANGED)
diff --git a/linden/indra/newview/llviewermedia_streamingaudio.h b/linden/indra/newview/llviewermedia_streamingaudio.h
index 816e213..5802a31 100644
--- a/linden/indra/newview/llviewermedia_streamingaudio.h
+++ b/linden/indra/newview/llviewermedia_streamingaudio.h
@@ -56,6 +56,7 @@ class LLStreamingAudio_MediaPlugins :
56 /*virtual*/ void setGain(F32 vol); 56 /*virtual*/ void setGain(F32 vol);
57 /*virtual*/ F32 getGain(); 57 /*virtual*/ F32 getGain();
58 /*virtual*/ std::string getURL(); 58 /*virtual*/ std::string getURL();
59 /*virtual*/ std::string getVersion();
59 60
60 // inherited from LLPluginClassMediaOwner 61 // inherited from LLPluginClassMediaOwner
61 /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); 62 /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
@@ -66,6 +67,7 @@ private:
66 LLPluginClassMedia *mMediaPlugin; 67 LLPluginClassMedia *mMediaPlugin;
67 std::string mURL; 68 std::string mURL;
68 F32 mGain; 69 F32 mGain;
70 std::string mVersion;
69}; 71};
70 72
71 73
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index 7f00382..777a871 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -41,6 +41,7 @@
41 41
42// linden library includes 42// linden library includes
43#include "llaudioengine.h" 43#include "llaudioengine.h"
44#include "llavatarnamecache.h"
44#include "indra_constants.h" 45#include "indra_constants.h"
45#include "llassetstorage.h" 46#include "llassetstorage.h"
46#include "llchat.h" 47#include "llchat.h"
@@ -102,6 +103,7 @@
102#include "llfloatercustomize.h" 103#include "llfloatercustomize.h"
103#include "llfloaterdaycycle.h" 104#include "llfloaterdaycycle.h"
104#include "llfloaterdirectory.h" 105#include "llfloaterdirectory.h"
106#include "llfloaterdisplayname.h"
105#include "llfloatereditui.h" 107#include "llfloatereditui.h"
106#include "llfloaterchatterbox.h" 108#include "llfloaterchatterbox.h"
107#include "llfloaterfriends.h" 109#include "llfloaterfriends.h"
@@ -3434,6 +3436,16 @@ class LLEditEnableCustomizeAvatar : public view_listener_t
3434 } 3436 }
3435}; 3437};
3436 3438
3439class LLEditEnableDisplayName : public view_listener_t
3440{
3441 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
3442 {
3443 bool new_value = (LLAvatarNameCache::useDisplayNames() != 0);
3444 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
3445 return true;
3446 }
3447};
3448
3437// only works on pie menu 3449// only works on pie menu
3438bool handle_sit_or_stand() 3450bool handle_sit_or_stand()
3439{ 3451{
@@ -5959,6 +5971,10 @@ class LLShowFloater : public view_listener_t
5959 { 5971 {
5960 LLToolBar::toggle(NULL); 5972 LLToolBar::toggle(NULL);
5961 } 5973 }
5974 else if (floater_name == "displayname")
5975 {
5976 LLFloaterDisplayName::show();
5977 }
5962 else if (floater_name == "chat history") 5978 else if (floater_name == "chat history")
5963 { 5979 {
5964 LLFloaterChat::toggleInstance(LLSD()); 5980 LLFloaterChat::toggleInstance(LLSD());
@@ -10666,6 +10682,20 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t
10666 } 10682 }
10667}; 10683};
10668 10684
10685///////////////////////////////////
10686// Reload Avatar Cloud Particles //
10687///////////////////////////////////
10688
10689
10690class LLAdvancedReloadAvatarCloudParticle : public view_listener_t
10691{
10692 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
10693 {
10694 LLVOAvatar::initCloud();
10695 return true;
10696 }
10697};
10698
10669/////////// 10699///////////
10670// Crash // 10700// Crash //
10671/////////// 10701///////////
@@ -11118,6 +11148,7 @@ void initialize_menus()
11118 addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate"); 11148 addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
11119 addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff"); 11149 addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
11120 addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar"); 11150 addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
11151 addMenu(new LLEditEnableDisplayName(), "Edit.EnableDisplayName");
11121 addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures"); 11152 addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures");
11122 11153
11123 // View menu 11154 // View menu
@@ -11453,6 +11484,7 @@ void initialize_menus()
11453 addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments"); 11484 addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments");
11454 addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures"); 11485 addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures");
11455 addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures"); 11486 addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures");
11487 addMenu(new LLAdvancedReloadAvatarCloudParticle(), "Advanced.ReloadAvatarCloudParticle");
11456 11488
11457 // Advanced > Crash 11489 // Advanced > Crash
11458 addMenu(new LLAdvancedCrash(), "Advanced.Crash"); 11490 addMenu(new LLAdvancedCrash(), "Advanced.Crash");
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 5f333e9..9ebfd04 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -2998,6 +2998,33 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2998 2998
2999 if (is_audible) 2999 if (is_audible)
3000 { 3000 {
3001 if (chatter && chatter->isAvatar())
3002 {
3003#ifdef LL_RRINTERFACE_H //MK
3004 if (!gRRenabled || !gAgent.mRRInterface.mContainsShownames)
3005 {
3006#endif //mk
3007 if (LLAvatarNameCache::useDisplayNames())
3008 {
3009 LLAvatarName avatar_name;
3010 if (LLAvatarNameCache::get(from_id, &avatar_name))
3011 {
3012 if (LLAvatarNameCache::useDisplayNames() == 1)
3013 {
3014 from_name = avatar_name.mDisplayName;
3015 }
3016 else
3017 {
3018 from_name = avatar_name.getNames();
3019 }
3020 }
3021 chat.mFromName = from_name;
3022 }
3023#ifdef LL_RRINTERFACE_H //MK
3024 }
3025#endif //mk
3026 }
3027
3001 BOOL visible_in_chat_bubble = FALSE; 3028 BOOL visible_in_chat_bubble = FALSE;
3002 std::string verb; 3029 std::string verb;
3003 3030
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index a2be26a..65c1d11 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -4206,7 +4206,7 @@ void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters,
4206 LLViewerImage* image; 4206 LLViewerImage* image;
4207 if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) 4207 if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
4208 { 4208 {
4209 image = gImageList.getImageFromFile("pixiesmall.tga"); 4209 image = gImageList.getImageFromFile("pixiesmall.j2c");
4210 } 4210 }
4211 else 4211 else
4212 { 4212 {
diff --git a/linden/indra/newview/llviewerparcelmgr.cpp b/linden/indra/newview/llviewerparcelmgr.cpp
index b589f2e..630da54 100644
--- a/linden/indra/newview/llviewerparcelmgr.cpp
+++ b/linden/indra/newview/llviewerparcelmgr.cpp
@@ -35,7 +35,7 @@
35#include "llviewerparcelmgr.h" 35#include "llviewerparcelmgr.h"
36 36
37// Library includes 37// Library includes
38#include "llaudioengine.h" 38#include "kokuastreamingaudio.h"
39#include "indra_constants.h" 39#include "indra_constants.h"
40#include "llcachename.h" 40#include "llcachename.h"
41#include "llgl.h" 41#include "llgl.h"
@@ -1672,7 +1672,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1672 else 1672 else
1673 { 1673 {
1674 // look for music. 1674 // look for music.
1675 if (gAudiop) 1675 if (gAudioStream)
1676 { 1676 {
1677 if (parcel) 1677 if (parcel)
1678 { 1678 {
@@ -1685,12 +1685,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1685 // On entering a new parcel, stop the last stream if the 1685 // On entering a new parcel, stop the last stream if the
1686 // new parcel has a different music url. (Empty URL counts 1686 // new parcel has a different music url. (Empty URL counts
1687 // as different.) 1687 // as different.)
1688 const std::string& stream_url = gAudiop->getInternetStreamURL(); 1688 const std::string& stream_url = gAudioStream->getInternetStreamURL();
1689 1689
1690 if (music_url.empty() || music_url != stream_url) 1690 if (music_url.empty() || music_url != stream_url)
1691 { 1691 {
1692 // URL is different from one currently playing. 1692 // URL is different from one currently playing.
1693 gAudiop->stopInternetStream(); 1693 gAudioStream->stopInternetStream();
1694 1694
1695 // If there is a new music URL and it's valid, play it. 1695 // If there is a new music URL and it's valid, play it.
1696 if (music_url.size() > 12) 1696 if (music_url.size() > 12)
@@ -1700,19 +1700,19 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1700 optionally_start_music(music_url); 1700 optionally_start_music(music_url);
1701 } 1701 }
1702 } 1702 }
1703 else if (!gAudiop->getInternetStreamURL().empty()) 1703 else if (!gAudioStream->getInternetStreamURL().empty())
1704 { 1704 {
1705 llinfos << "Stopping parcel music" << llendl; 1705 llinfos << "Stopping parcel music" << llendl;
1706 gAudiop->startInternetStream(LLStringUtil::null); 1706 gAudioStream->startInternetStream(LLStringUtil::null);
1707 } 1707 }
1708 } 1708 }
1709 } 1709 }
1710 else 1710 else
1711 { 1711 {
1712 // Public land has no music 1712 // Public land has no music
1713 gAudiop->stopInternetStream(); 1713 gAudioStream->stopInternetStream();
1714 } 1714 }
1715 }//if gAudiop 1715 }//if gAudioStream
1716 1716
1717 // now check for video 1717 // now check for video
1718 LLViewerParcelMedia::update( parcel ); 1718 LLViewerParcelMedia::update( parcel );
@@ -1730,7 +1730,7 @@ void optionally_start_music(const std::string& music_url)
1730 // changed as part of SL-4878 1730 // changed as part of SL-4878
1731 if ( gOverlayBar && gOverlayBar->musicPlaying()) 1731 if ( gOverlayBar && gOverlayBar->musicPlaying())
1732 { 1732 {
1733 gAudiop->startInternetStream(music_url); 1733 gAudioStream->startInternetStream(music_url);
1734 } 1734 }
1735 } 1735 }
1736} 1736}
diff --git a/linden/indra/newview/llviewerprecompiledheaders.h b/linden/indra/newview/llviewerprecompiledheaders.h
index 9bc6574..a0b99bf 100644
--- a/linden/indra/newview/llviewerprecompiledheaders.h
+++ b/linden/indra/newview/llviewerprecompiledheaders.h
@@ -165,7 +165,7 @@
165#include "llinstantmessage.h" 165#include "llinstantmessage.h"
166#include "llinvite.h" 166#include "llinvite.h"
167//#include "llloginflags.h" 167//#include "llloginflags.h"
168#include "llmail.h" 168//#include "llmail.h"
169#include "llmessagethrottle.h" 169#include "llmessagethrottle.h"
170#include "llnamevalue.h" 170#include "llnamevalue.h"
171#include "llpacketack.h" 171#include "llpacketack.h"
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp
index d93c425..a8047b8 100644
--- a/linden/indra/newview/llviewerregion.cpp
+++ b/linden/indra/newview/llviewerregion.cpp
@@ -127,6 +127,8 @@ public:
127 } 127 }
128 } 128 }
129 129
130 mRegion->setCapabilitiesReceived(true);
131
130 if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) 132 if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
131 { 133 {
132 LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); 134 LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
@@ -172,7 +174,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
172 mCacheEntriesCount(0), 174 mCacheEntriesCount(0),
173 mCacheID(), 175 mCacheID(),
174 mEventPoll(NULL), 176 mEventPoll(NULL),
175 mReleaseNotesRequested(FALSE) 177 mReleaseNotesRequested(FALSE),
178 mCapabilitiesReceived(false)
176{ 179{
177 mWidth = region_width_meters; 180 mWidth = region_width_meters;
178 mOriginGlobal = from_region_handle(handle); 181 mOriginGlobal = from_region_handle(handle);
@@ -1431,6 +1434,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
1431 capabilityNames.append("FetchInventory"); 1434 capabilityNames.append("FetchInventory");
1432 capabilityNames.append("FetchLib"); 1435 capabilityNames.append("FetchLib");
1433 capabilityNames.append("FetchLibDescendents"); 1436 capabilityNames.append("FetchLibDescendents");
1437 capabilityNames.append("GetDisplayNames");
1438 capabilityNames.append("SetDisplayName");
1434 capabilityNames.append("GetTexture"); 1439 capabilityNames.append("GetTexture");
1435 capabilityNames.append("GroupProposalBallot"); 1440 capabilityNames.append("GroupProposalBallot");
1436 capabilityNames.append("HomeLocation"); 1441 capabilityNames.append("HomeLocation");
@@ -1509,6 +1514,16 @@ std::string LLViewerRegion::getCapability(const std::string& name) const
1509 return iter->second; 1514 return iter->second;
1510} 1515}
1511 1516
1517bool LLViewerRegion::capabilitiesReceived() const
1518{
1519 return mCapabilitiesReceived;
1520}
1521
1522void LLViewerRegion::setCapabilitiesReceived(bool received)
1523{
1524 mCapabilitiesReceived = received;
1525}
1526
1512void LLViewerRegion::logActiveCapabilities() const 1527void LLViewerRegion::logActiveCapabilities() const
1513{ 1528{
1514 int count = 0; 1529 int count = 0;
diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h
index 8cc80e3..5ce8b2e 100644
--- a/linden/indra/newview/llviewerregion.h
+++ b/linden/indra/newview/llviewerregion.h
@@ -229,6 +229,11 @@ public:
229 void setSeedCapability(const std::string& url); 229 void setSeedCapability(const std::string& url);
230 void setCapability(const std::string& name, const std::string& url); 230 void setCapability(const std::string& name, const std::string& url);
231 std::string getCapability(const std::string& name) const; 231 std::string getCapability(const std::string& name) const;
232
233 // has region received its final (not seed) capability list?
234 bool capabilitiesReceived() const;
235 void setCapabilitiesReceived(bool received);
236
232 static bool isSpecialCapabilityName(const std::string &name); 237 static bool isSpecialCapabilityName(const std::string &name);
233 void logActiveCapabilities() const; 238 void logActiveCapabilities() const;
234 239
@@ -399,6 +404,7 @@ private:
399 404
400private: 405private:
401 bool mAlive; // can become false if circuit disconnects 406 bool mAlive; // can become false if circuit disconnects
407 bool mCapabilitiesReceived;
402 408
403 //spatial partitions for objects in this region 409 //spatial partitions for objects in this region
404 std::vector<LLSpatialPartition*> mObjectPartition; 410 std::vector<LLSpatialPartition*> mObjectPartition;
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index de6b22d..e1fa61f 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -38,6 +38,7 @@
38#include <ctype.h> 38#include <ctype.h>
39 39
40#include "llaudioengine.h" 40#include "llaudioengine.h"
41#include "llavatarnamecache.h"
41#include "noise.h" 42#include "noise.h"
42 43
43#include "llagent.h" // Get state values from here 44#include "llagent.h" // Get state values from here
@@ -748,6 +749,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
748 mAppearanceAnimating(FALSE), 749 mAppearanceAnimating(FALSE),
749 mNameString(), 750 mNameString(),
750 mTitle(), 751 mTitle(),
752 mCompleteName(),
751 mNameAway(FALSE), 753 mNameAway(FALSE),
752 mNameBusy(FALSE), 754 mNameBusy(FALSE),
753 mNameMute(FALSE), 755 mNameMute(FALSE),
@@ -1474,6 +1476,7 @@ void LLVOAvatar::initClass()
1474 { 1476 {
1475 loadClientTags(); 1477 loadClientTags();
1476 } 1478 }
1479 initCloud();
1477} 1480}
1478 1481
1479 1482
@@ -1489,6 +1492,21 @@ void LLVOAvatar::cleanupClass()
1489 sXMLTree.cleanup(); 1492 sXMLTree.cleanup();
1490} 1493}
1491 1494
1495LLPartSysData LLVOAvatar::sCloud;
1496void LLVOAvatar::initCloud()
1497{
1498 // fancy particle cloud designed by Brent
1499
1500 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "cloud.xml");
1501 LLSD cloud;
1502 llifstream in_file(filename);
1503 LLSDSerialize::fromXMLDocument(cloud, in_file);
1504 sCloud.fromLLSD(cloud);
1505 LLViewerImage* cloud_image = gImageList.getImageFromFile("cloud-particle.j2c");
1506 sCloud.mPartImageID = cloud_image->getID();
1507
1508}
1509
1492const LLVector3 LLVOAvatar::getRenderPosition() const 1510const LLVector3 LLVOAvatar::getRenderPosition() const
1493{ 1511{
1494 if (mDrawable.isNull() || mDrawable->getGeneration() < 0) 1512 if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
@@ -2872,7 +2890,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
2872 param; 2890 param;
2873 param = getNextVisualParam()) 2891 param = getNextVisualParam())
2874 { 2892 {
2875 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 2893 if (param->isTweakable())
2876 { 2894 {
2877 param->stopAnimating(mAppearanceAnimSetByUser); 2895 param->stopAnimating(mAppearanceAnimSetByUser);
2878 } 2896 }
@@ -2904,7 +2922,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
2904 param; 2922 param;
2905 param = getNextVisualParam()) 2923 param = getNextVisualParam())
2906 { 2924 {
2907 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 2925 if (param->isTweakable())
2908 { 2926 {
2909 // so boobs don't go spastic when a shape's changed, but still seems buggy 2927 // so boobs don't go spastic when a shape's changed, but still seems buggy
2910 //if(param->getID() != 507) 2928 //if(param->getID() != 507)
@@ -3070,34 +3088,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
3070 } 3088 }
3071 else 3089 else
3072 { 3090 {
3073 LLPartSysData particle_parameters; 3091 setParticleSource(sCloud, getID());
3074
3075 // fancy particle cloud designed by Brent
3076 particle_parameters.mPartData.mMaxAge = 4.f;
3077 particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
3078 particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
3079 particle_parameters.mPartData.mStartScale.mV[VY] = 1.0f;
3080 particle_parameters.mPartData.mEndScale.mV[VX] = 0.02f;
3081 particle_parameters.mPartData.mEndScale.mV[VY] = 0.02f;
3082 particle_parameters.mPartData.mStartColor = LLColor4(1, 1, 1, 0.5f);
3083 particle_parameters.mPartData.mEndColor = LLColor4(1, 1, 1, 0.0f);
3084 particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
3085 LLViewerImage* cloud = gImageList.getImageFromFile("cloud-particle.j2c");
3086 particle_parameters.mPartImageID = cloud->getID();
3087 particle_parameters.mMaxAge = 0.f;
3088 particle_parameters.mPattern = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE;
3089 particle_parameters.mInnerAngle = 3.14159f;
3090 particle_parameters.mOuterAngle = 0.f;
3091 particle_parameters.mBurstRate = 0.02f;
3092 particle_parameters.mBurstRadius = 0.0f;
3093 particle_parameters.mBurstPartCount = 1;
3094 particle_parameters.mBurstSpeedMin = 0.1f;
3095 particle_parameters.mBurstSpeedMax = 1.f;
3096 particle_parameters.mPartData.mFlags = ( LLPartData::LL_PART_INTERP_COLOR_MASK | LLPartData::LL_PART_INTERP_SCALE_MASK |
3097 LLPartData::LL_PART_EMISSIVE_MASK | // LLPartData::LL_PART_FOLLOW_SRC_MASK |
3098 LLPartData::LL_PART_TARGET_POS_MASK );
3099
3100 setParticleSource(particle_parameters, getID());
3101 } 3092 }
3102 } 3093 }
3103} 3094}
@@ -3633,6 +3624,35 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3633 3624
3634 if (mNameText.notNull() && firstname && lastname) 3625 if (mNameText.notNull() && firstname && lastname)
3635 { 3626 {
3627 std::string complete_name = firstname->getString();
3628 if (sRenderGroupTitles)
3629 {
3630 complete_name += " ";
3631 }
3632 else
3633 {
3634 // If all group titles are turned off, stack first name
3635 // on a line above last name
3636 complete_name += "\n";
3637 }
3638 complete_name += lastname->getString();
3639
3640 if (LLAvatarNameCache::useDisplayNames())
3641 {
3642 LLAvatarName avatar_name;
3643 if (LLAvatarNameCache::get(getID(), &avatar_name))
3644 {
3645 if (LLAvatarNameCache::useDisplayNames() == 1)
3646 {
3647 complete_name = avatar_name.mDisplayName;
3648 }
3649 else
3650 {
3651 complete_name = avatar_name.getNames(true);
3652 }
3653 }
3654 }
3655
3636 BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end(); 3656 BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end();
3637 BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); 3657 BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
3638 BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); 3658 BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
@@ -3647,7 +3667,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3647 } 3667 }
3648 3668
3649 if (mNameString.empty() || 3669 if (mNameString.empty() ||
3650 new_name || 3670 new_name || complete_name != mCompleteName ||
3651 (!title && !mTitle.empty()) || 3671 (!title && !mTitle.empty()) ||
3652 (title && mTitle != title->getString()) || 3672 (title && mTitle != title->getString()) ||
3653 (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute) 3673 (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute)
@@ -3663,20 +3683,19 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3663 line += title->getString(); 3683 line += title->getString();
3664 //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe 3684 //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
3665 line += "\n"; 3685 line += "\n";
3666 line += firstname->getString(); 3686 line += complete_name;
3667 } 3687 }
3668 else 3688 else
3669 { 3689 {
3670 line += firstname->getString(); 3690 line += complete_name;
3671 } 3691 }
3672 3692
3673 line += " "; 3693
3674 line += lastname->getString();
3675// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b 3694// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
3676 } 3695 }
3677 else 3696 else
3678 { 3697 {
3679 line = RlvStrings::getAnonym(line.assign(firstname->getString()).append(" ").append(lastname->getString())); 3698 line = RlvStrings::getAnonym(complete_name);
3680 } 3699 }
3681// [/RLVa:KB] 3700// [/RLVa:KB]
3682 3701
@@ -3686,7 +3705,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3686 bool show_client = client.length() != 0 && (*sShowClientNameTag); 3705 bool show_client = client.length() != 0 && (*sShowClientNameTag);
3687 if (is_away || is_muted || is_busy || show_client) 3706 if (is_away || is_muted || is_busy || show_client)
3688 { 3707 {
3689 line += " ("; 3708 line += "\n(";
3690 if (is_away) 3709 if (is_away)
3691 { 3710 {
3692 line += "Away"; 3711 line += "Away";
@@ -3731,6 +3750,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3731 mNameMute = is_muted; 3750 mNameMute = is_muted;
3732 mNameAppearance = is_appearance; 3751 mNameAppearance = is_appearance;
3733 mTitle = title ? title->getString() : ""; 3752 mTitle = title ? title->getString() : "";
3753 mCompleteName = complete_name;
3734 //LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); IMP-136 -- McCabe 3754 //LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
3735 mNameString = utf8str_to_wstring(line); 3755 mNameString = utf8str_to_wstring(line);
3736 new_name = TRUE; 3756 new_name = TRUE;
@@ -3847,6 +3867,41 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3847 } 3867 }
3848} 3868}
3849 3869
3870void LLVOAvatar::clearNameTag()
3871{
3872 mNameString.clear();
3873 if (mNameText)
3874 {
3875 mNameText->setLabel("");
3876 mNameText->setString(mNameString);
3877 }
3878}
3879
3880//static
3881void LLVOAvatar::invalidateNameTag(const LLUUID& agent_id)
3882{
3883 LLViewerObject* obj = gObjectList.findObject(agent_id);
3884 if (!obj) return;
3885
3886 LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(obj);
3887 if (!avatar) return;
3888
3889 avatar->clearNameTag();
3890}
3891
3892//static
3893void LLVOAvatar::invalidateNameTags()
3894{
3895 std::vector<LLCharacter*>::iterator it;
3896 for (it = LLCharacter::sInstances.begin(); it != LLCharacter::sInstances.end(); ++it)
3897 {
3898 LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*it);
3899 if (!avatar) continue;
3900 if (avatar->isDead()) continue;
3901
3902 avatar->clearNameTag();
3903 }
3904}
3850 3905
3851void LLVOAvatar::idleUpdateTractorBeam() 3906void LLVOAvatar::idleUpdateTractorBeam()
3852{ 3907{
@@ -4833,6 +4888,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
4833 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked 4888 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
4834 && !LLDrawPoolAvatar::sSkipTransparent; 4889 && !LLDrawPoolAvatar::sSkipTransparent;
4835 4890
4891
4836 LLGLState test(GL_ALPHA_TEST, should_alpha_mask); 4892 LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
4837 4893
4838 if (should_alpha_mask) 4894 if (should_alpha_mask)
@@ -4948,7 +5004,6 @@ U32 LLVOAvatar::renderRigid()
4948 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked 5004 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
4949 && !LLDrawPoolAvatar::sSkipTransparent; 5005 && !LLDrawPoolAvatar::sSkipTransparent;
4950 5006
4951
4952 LLGLState test(GL_ALPHA_TEST, should_alpha_mask); 5007 LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
4953 5008
4954 if (should_alpha_mask) 5009 if (should_alpha_mask)
@@ -5931,6 +5986,7 @@ BOOL LLVOAvatar::loadAvatar()
5931 if (sAvatarXmlInfo->mLayerInfoList.empty()) 5986 if (sAvatarXmlInfo->mLayerInfoList.empty())
5932 { 5987 {
5933 llwarns << "avatar file: missing <layer_set> node" << llendl; 5988 llwarns << "avatar file: missing <layer_set> node" << llendl;
5989 return FALSE;
5934 } 5990 }
5935 else 5991 else
5936 { 5992 {
@@ -5971,23 +6027,22 @@ BOOL LLVOAvatar::loadAvatar()
5971 } 6027 }
5972 6028
5973 // avatar_lad.xml : <driver_parameters> 6029 // avatar_lad.xml : <driver_parameters>
6030 LLVOAvatarXmlInfo::driver_info_list_t::iterator iter;
6031 for (iter = sAvatarXmlInfo->mDriverInfoList.begin();
6032 iter != sAvatarXmlInfo->mDriverInfoList.end(); iter++)
5974 { 6033 {
5975 LLVOAvatarXmlInfo::driver_info_list_t::iterator iter; 6034 LLDriverParamInfo *info = *iter;
5976 for (iter = sAvatarXmlInfo->mDriverInfoList.begin(); 6035 LLDriverParam* driver_param = new LLDriverParam( this );
5977 iter != sAvatarXmlInfo->mDriverInfoList.end(); iter++) 6036 if (driver_param->setInfo(info))
5978 { 6037 {
5979 LLDriverParamInfo *info = *iter; 6038 addVisualParam( driver_param );
5980 LLDriverParam* driver_param = new LLDriverParam( this ); 6039 }
5981 if (driver_param->setInfo(info)) 6040 else
5982 { 6041 {
5983 addVisualParam( driver_param ); 6042 delete driver_param;
5984 } 6043 llwarns << "avatar file: driver_param->parseData() failed" << llendl;
5985 else 6044 return FALSE;
5986 { 6045
5987 delete driver_param;
5988 llwarns << "avatar file: driver_param->parseData() failed" << llendl;
5989 return FALSE;
5990 }
5991 } 6046 }
5992 } 6047 }
5993 6048
@@ -8160,6 +8215,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] )
8160 param_name[2] = "skirt_blue"; 8215 param_name[2] = "skirt_blue";
8161 break; 8216 break;
8162 8217
8218 case TEX_HEAD_TATTOO:
8219 case TEX_LOWER_TATTOO:
8220 case TEX_UPPER_TATTOO:
8221 param_name[0] = "tattoo_red";
8222 param_name[1] = "tattoo_green";
8223 param_name[2] = "tattoo_blue";
8224 break;
8225
8163 default: 8226 default:
8164 llassert(0); 8227 llassert(0);
8165 return FALSE; 8228 return FALSE;
@@ -8619,7 +8682,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
8619 { 8682 {
8620 for( S32 i = 0; i < num_blocks; i++ ) 8683 for( S32 i = 0; i < num_blocks; i++ )
8621 { 8684 {
8622 while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) 8685 while( param && (!param->isTweakable()) )
8623 { 8686 {
8624 param = getNextVisualParam(); 8687 param = getNextVisualParam();
8625 } 8688 }
@@ -8627,7 +8690,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
8627 if( !param ) 8690 if( !param )
8628 { 8691 {
8629 llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; 8692 llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
8630 return; 8693 break;
8631 } 8694 }
8632 8695
8633 U8 value; 8696 U8 value;
@@ -8668,14 +8731,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
8668 } 8731 }
8669 } 8732 }
8670 8733
8671 while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) 8734 S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT
8735 if (num_blocks != expected_tweakable_count)
8672 { 8736 {
8673 param = getNextVisualParam(); 8737 llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. Object: " << getID() << llendl;
8674 }
8675 if( param )
8676 {
8677 llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
8678 return;
8679 } 8738 }
8680 8739
8681 if (params_changed) 8740 if (params_changed)
@@ -8946,8 +9005,7 @@ void LLVOAvatar::dumpArchetypeXML( void* )
8946 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 9005 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
8947 { 9006 {
8948 LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; 9007 LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param;
8949 if( (viewer_param->getWearableType() == type) && 9008 if (viewer_param->getWearableType() == type && viewer_param->isTweakable())
8950 (viewer_param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) )
8951 { 9009 {
8952 apr_file_printf( file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n", 9010 apr_file_printf( file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n",
8953 viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight() ); 9011 viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight() );
diff --git a/linden/indra/newview/llvoavatar.h b/linden/indra/newview/llvoavatar.h
index 548818d..e585a6a 100644
--- a/linden/indra/newview/llvoavatar.h
+++ b/linden/indra/newview/llvoavatar.h
@@ -97,6 +97,7 @@ public:
97 static void initClass(); // Initialize data that's only init'd once per class. 97 static void initClass(); // Initialize data that's only init'd once per class.
98 static void cleanupClass(); // Cleanup data that's only init'd once per class. 98 static void cleanupClass(); // Cleanup data that's only init'd once per class.
99 static BOOL parseSkeletonFile(const std::string& filename); 99 static BOOL parseSkeletonFile(const std::string& filename);
100 static void initCloud();
100 virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, 101 virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
101 void **user_data, 102 void **user_data,
102 U32 block_num, 103 U32 block_num,
@@ -111,6 +112,10 @@ public:
111 void idleUpdateWindEffect(); 112 void idleUpdateWindEffect();
112 void idleUpdateBoobEffect(); 113 void idleUpdateBoobEffect();
113 void idleUpdateNameTag(const LLVector3& root_pos_last); 114 void idleUpdateNameTag(const LLVector3& root_pos_last);
115 void clearNameTag();
116 static void invalidateNameTag(const LLUUID& agent_id);
117 // force all name tags to rebuild, useful when display names turned on/off
118 static void invalidateNameTags();
114 void idleUpdateRenderCost(); 119 void idleUpdateRenderCost();
115 void idleUpdateTractorBeam(); 120 void idleUpdateTractorBeam();
116 void idleUpdateBelowWater(); 121 void idleUpdateBelowWater();
@@ -582,6 +587,7 @@ public:
582 static F32 sLODFactor; // user-settable LOD factor 587 static F32 sLODFactor; // user-settable LOD factor
583 static BOOL sJointDebug; // output total number of joints being touched for each avatar 588 static BOOL sJointDebug; // output total number of joints being touched for each avatar
584 static BOOL sDebugAvatarRotation; 589 static BOOL sDebugAvatarRotation;
590 static LLPartSysData sCloud;
585 591
586 static S32 sNumVisibleAvatars; // Number of instances of this class 592 static S32 sNumVisibleAvatars; // Number of instances of this class
587 593
@@ -675,6 +681,7 @@ protected:
675 681
676 LLWString mNameString; 682 LLWString mNameString;
677 std::string mTitle; 683 std::string mTitle;
684 std::string mCompleteName;
678 BOOL mNameAway; 685 BOOL mNameAway;
679 BOOL mNameBusy; 686 BOOL mNameBusy;
680 BOOL mNameMute; 687 BOOL mNameMute;
diff --git a/linden/indra/newview/llvoiceclient.cpp b/linden/indra/newview/llvoiceclient.cpp
index d67b9e3..7b1ed95 100644
--- a/linden/indra/newview/llvoiceclient.cpp
+++ b/linden/indra/newview/llvoiceclient.cpp
@@ -1795,7 +1795,7 @@ void LLVoiceClient::stateMachine()
1795 1795
1796 if(!mSocket) 1796 if(!mSocket)
1797 { 1797 {
1798 mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); 1798 mSocket = LLSocket::create(LLSocket::STREAM_TCP);
1799 } 1799 }
1800 1800
1801 mConnected = mSocket->blockingConnect(mDaemonHost); 1801 mConnected = mSocket->blockingConnect(mDaemonHost);
diff --git a/linden/indra/newview/llwatchdog.cpp b/linden/indra/newview/llwatchdog.cpp
index 330bc8a..9af050c 100644
--- a/linden/indra/newview/llwatchdog.cpp
+++ b/linden/indra/newview/llwatchdog.cpp
@@ -184,8 +184,8 @@ void LLWatchdog::init(killer_event_callback func)
184 mKillerCallback = func; 184 mKillerCallback = func;
185 if(!mSuspectsAccessMutex && !mTimer) 185 if(!mSuspectsAccessMutex && !mTimer)
186 { 186 {
187 mSuspectsAccessMutex = new LLMutex(NULL); 187 mSuspectsAccessMutex = new LLMutex;
188 mTimer = new LLWatchdogTimerThread(); 188 mTimer = new LLWatchdogTimerThread;
189 mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); 189 mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000);
190 mLastClockCount = LLTimer::getTotalTime(); 190 mLastClockCount = LLTimer::getTotalTime();
191 191
diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp
index b74ef02..f8123bb 100644
--- a/linden/indra/newview/llwearable.cpp
+++ b/linden/indra/newview/llwearable.cpp
@@ -535,7 +535,7 @@ BOOL LLWearable::isOldVersion()
535 param; 535 param;
536 param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) 536 param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
537 { 537 {
538 if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 538 if (param->getWearableType() == mType && param->isTweakable())
539 { 539 {
540 param_count++; 540 param_count++;
541 if( !is_in_map(mVisualParamMap, param->getID() ) ) 541 if( !is_in_map(mVisualParamMap, param->getID() ) )
@@ -591,7 +591,7 @@ BOOL LLWearable::isDirty()
591 param; 591 param;
592 param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) 592 param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
593 { 593 {
594 if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 594 if (param->getWearableType() == mType && param->isTweakable())
595 { 595 {
596 F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight()); 596 F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight());
597 weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); 597 weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() );
@@ -690,7 +690,7 @@ void LLWearable::setParamsToDefaults()
690 mVisualParamMap.clear(); 690 mVisualParamMap.clear();
691 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 691 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
692 { 692 {
693 if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 693 if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable())
694 { 694 {
695 mVisualParamMap[param->getID()] = param->getDefaultWeight(); 695 mVisualParamMap[param->getID()] = param->getDefaultWeight();
696 } 696 }
@@ -724,7 +724,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
724 // Pull params 724 // Pull params
725 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 725 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
726 { 726 {
727 if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 727 if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable())
728 { 728 {
729 S32 param_id = param->getID(); 729 S32 param_id = param->getID();
730 F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight()); 730 F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight());
@@ -825,7 +825,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
825 // Pull params 825 // Pull params
826 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 826 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
827 { 827 {
828 if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 828 if (((LLViewerVisualParam*)param)->getWearableType() == type && param->isTweakable())
829 { 829 {
830 S32 param_id = param->getID(); 830 S32 param_id = param->getID();
831 avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user ); 831 avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user );
@@ -873,7 +873,7 @@ void LLWearable::readFromAvatar()
873 mVisualParamMap.clear(); 873 mVisualParamMap.clear();
874 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 874 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
875 { 875 {
876 if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 876 if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable())
877 { 877 {
878 878
879 //pretty sure is right 879 //pretty sure is right
@@ -938,7 +938,7 @@ void LLWearable::copyDataFrom( LLWearable* src )
938 param; 938 param;
939 param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) 939 param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
940 { 940 {
941 if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 941 if (param->getWearableType() == mType && param->isTweakable())
942 { 942 {
943 S32 id = param->getID(); 943 S32 id = param->getID();
944 F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() ); 944 F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() );
diff --git a/linden/indra/newview/skins/default/xui/de/notifications.xml b/linden/indra/newview/skins/default/xui/de/notifications.xml
index b2975df..3e08d33 100644
--- a/linden/indra/newview/skins/default/xui/de/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/de/notifications.xml
@@ -1442,21 +1442,6 @@ Die Option zum Austritt aus einer Gruppe finden Sie unter „Bearbeiten“ &gt;
1442 <button name="Cancel" text="Abbrechen"/> 1442 <button name="Cancel" text="Abbrechen"/>
1443 </form> 1443 </form>
1444 </notification> 1444 </notification>
1445 <notification label="Linden-Grundstück ändern" name="ChangeLindenEstate">
1446 Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
1447
1448Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat. Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet.
1449
1450Fortfahren?
1451 <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
1452 </notification>
1453 <notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess">
1454 Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
1455
1456Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen.
1457Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet.
1458 <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
1459 </notification>
1460 <notification label="Grundstück wählen" name="EstateAllowedAgentAdd"> 1445 <notification label="Grundstück wählen" name="EstateAllowedAgentAdd">
1461 Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen? 1446 Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen?
1462 <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> 1447 <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
index a0dd938..d5b61a7 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
@@ -1172,11 +1172,15 @@ scratch and wear it.
1172 <texture_picker name="Lower Tattoo" label="Lower Tattoo" tool_tip="Click to choose a picture" 1172 <texture_picker name="Lower Tattoo" label="Lower Tattoo" tool_tip="Click to choose a picture"
1173 can_apply_immediately="true" default_image_name="Default" allow_no_texture="true" 1173 can_apply_immediately="true" default_image_name="Default" allow_no_texture="true"
1174 follows="left|top" width="70" height="80" left="14" bottom="-325"/> 1174 follows="left|top" width="70" height="80" left="14" bottom="-325"/>
1175 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-415"
1176 can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
1177 label="Color/Tint" left="14" mouse_opaque="true" name="Color/Tint"
1178 tool_tip="Click to open Color Picker" width="70" />
1175 <button name="Create New" label="Create New Tattoo" label_selected="Create New Tattoo" 1179 <button name="Create New" label="Create New Tattoo" label_selected="Create New Tattoo"
1176 follows="left|top" halign="center" width="170" height="24" left="8" bottom="-128" 1180 follows="left|top" halign="center" width="170" height="24" left="8" bottom="-128"
1177 mouse_opaque="true" scale_image="true"/> 1181 mouse_opaque="true" scale_image="true"/>
1178 <button name="Take Off" label="Take Off" label_selected="Take Off" 1182 <button name="Take Off" label="Take Off" label_selected="Take Off"
1179 follows="left|top" width="82" height="20" left="8" bottom="-365"/> 1183 follows="left|top" width="82" height="20" left="8" bottom="-440"/>
1180 <button name="Save" label="Save" label_selected="Save" 1184 <button name="Save" label="Save" label_selected="Save"
1181 follows="right|bottom" width="82" height="20" left="123" bottom="-478"/> 1185 follows="right|bottom" width="82" height="20" left="123" bottom="-478"/>
1182 <button name="Save As" label="Save As..." label_selected="Save As..." 1186 <button name="Save As" label="Save As..." label_selected="Save As..."
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml b/linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml
new file mode 100644
index 0000000..5875efb
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml
@@ -0,0 +1,42 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="Display Name" title="CHANGE DISPLAY NAME"
3 can_minimize="true" can_close="true" can_resize="false"
4 enabled="true" mouse_opaque="true"
5 height="235" width="440">
6 <text name="info_text1" font="SansSerif" wrap="true"
7 height="18" width="380" left="42" bottom_delta="-48" follows="left|top">
8 The name you give to your avatar is called your Display Name.
9 </text>
10 <text name="info_text2" font="SansSerif" wrap="true"
11 height="18" width="300" left="120" bottom_delta="-18" follows="left|top">
12 You can change it once a week.
13 </text>
14 <text name="now_ok_text" font="SansSerif"
15 height="18" width="320" left="105" bottom_delta="-25" follows="left|top">
16 You can change it now if you so wish.
17 </text>
18 <text name="lockout_text" font="SansSerif" visible="false"
19 height="18" width="380" left="20" bottom_delta="0" follows="left|top">
20 You cannot change it before: [TIME].
21 </text>
22 <text name="set_name_label" font="SansSerif"
23 height="20" width="380" left="20" bottom_delta="-25" follows="left|top">
24 New Display Name:
25 </text>
26 <line_editor name="display_name_editor" max_length="31"
27 height="20" width="360" left="40" bottom_delta="-20" follows="left|top" />
28 <text name="name_confirm_label" font="SansSerif"
29 height="20" width="380" left="20" bottom_delta="-32" follows="left|top">
30 Type your new name again to confirm:
31 </text>
32 <line_editor name="display_name_confirm" max_length="31"
33 height="20" width="360" left="40" bottom_delta="-20" follows="left|top" />
34 <button name="save_btn" label="Save" font="SansSerif"
35 tool_tip="Save your new Display Name"
36 height="20" width="120" left="30" bottom_delta="-32"/>
37 <button name="reset_btn" label="Reset" font="SansSerif"
38 tool_tip="Make Display Name the same as Username"
39 height="20" width="120" left_delta="130" bottom_delta="0"/>
40 <button name="cancel_btn" label="Cancel" font="SansSerif"
41 height="20" width="120" left_delta="130" bottom_delta="0"/>
42</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml b/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml
index c93b890..5d766be 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml
@@ -8,7 +8,7 @@
8 column_padding="5" draw_border="true" draw_heading="false" 8 column_padding="5" draw_border="true" draw_heading="false"
9 draw_stripes="true" enabled="true" follows="left|top|right|bottom" 9 draw_stripes="true" enabled="true" follows="left|top|right|bottom"
10 height="290" left="6" mouse_opaque="true" multi_select="false" 10 height="290" left="6" mouse_opaque="true" multi_select="false"
11 name="user_list" width="421" /> 11 name="user_list" use_display_names="true" width="421" />
12 <button bottom="-271" enabled="true" follows="right|bottom" font="SansSerif" 12 <button bottom="-271" enabled="true" follows="right|bottom" font="SansSerif"
13 halign="center" height="20" label="Start" label_selected="Start" left="435" 13 halign="center" height="20" label="Start" label_selected="Start" left="435"
14 mouse_opaque="true" name="start_btn" scale_image="true" sound_flags="0" 14 mouse_opaque="true" name="start_btn" scale_image="true" sound_flags="0"
@@ -17,9 +17,6 @@
17 halign="center" height="20" label="Close" label_selected="Close" left="435" 17 halign="center" height="20" label="Close" label_selected="Close" left="435"
18 mouse_opaque="true" name="close_btn" scale_image="true" sound_flags="0" 18 mouse_opaque="true" name="close_btn" scale_image="true" sound_flags="0"
19 width="60" /> 19 width="60" />
20 <string name="name_format">
21 [FIRST] [LAST]
22 </string>
23 <string name="online_descriptor"> 20 <string name="online_descriptor">
24 (online) 21 (online)
25 </string> 22 </string>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml b/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
index 81dd05a..69e62f8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
@@ -21,7 +21,7 @@
21 <check_box bottom="-276" enabled="true" follows="left|top" font="SansSerifSmall" 21 <check_box bottom="-276" enabled="true" follows="left|top" font="SansSerifSmall"
22 height="16" initial_value="false" label="Eyes" left="13" 22 height="16" initial_value="false" label="Eyes" left="13"
23 mouse_opaque="true" name="checkbox_Eyes" radio_style="false" width="100" /> 23 mouse_opaque="true" name="checkbox_Eyes" radio_style="false" width="100" />
24 <check_box bottom="-456" enabled="true" follows="left|top" font="SansSerifSmall" 24 <check_box bottom="-434" enabled="true" follows="left|top" font="SansSerifSmall"
25 height="16" initial_value="false" label="Rename Clothing To Folder Name" 25 height="16" initial_value="false" label="Rename Clothing To Folder Name"
26 left="13" mouse_opaque="true" name="rename" radio_style="false" width="210" /> 26 left="13" mouse_opaque="true" name="rename" radio_style="false" width="210" />
27 <check_box bottom="-216" enabled="true" follows="left|top" font="SansSerifSmall" 27 <check_box bottom="-216" enabled="true" follows="left|top" font="SansSerifSmall"
@@ -256,7 +256,7 @@ now wearing into it.
256 Attachments: 256 Attachments:
257 </text> 257 </text>
258 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 258 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
259 bottom="-436" drop_shadow_visible="true" enabled="true" follows="left|top" 259 bottom="-414" drop_shadow_visible="true" enabled="true" follows="left|top"
260 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="13" 260 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="13"
261 mouse_opaque="true" name="Options:" v_pad="0" width="100"> 261 mouse_opaque="true" name="Options:" v_pad="0" width="100">
262 Options: 262 Options:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml b/linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml
index daf217e..314ad20 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml
@@ -154,7 +154,7 @@
154 mouse_opaque="true" name="spin y" 154 mouse_opaque="true" name="spin y"
155 tool_tip="Y coordinate of location to show on map" width="48" /> 155 tool_tip="Y coordinate of location to show on map" width="48" />
156 <spinner bottom_delta="0" decimal_digits="0" follows="bottom|right" height="16" 156 <spinner bottom_delta="0" decimal_digits="0" follows="bottom|right" height="16"
157 increment="1" initial_val="0" left_delta="50" max_val="4096" min_val="0" 157 increment="1" initial_val="0" left_delta="50" max_val="16383" min_val="0"
158 mouse_opaque="true" name="spin z" 158 mouse_opaque="true" name="spin z"
159 tool_tip="Z coordinate of location to show on map" width="48" /> 159 tool_tip="Z coordinate of location to show on map" width="48" />
160 <button bottom="-625" follows="right|bottom" font="SansSerif" halign="center" 160 <button bottom="-625" follows="right|bottom" font="SansSerif" halign="center"
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index 31e730a..c2424d7 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -259,6 +259,11 @@
259 userdata="appearance" /> 259 userdata="appearance" />
260 <on_enable function="Edit.EnableCustomizeAvatar" /> 260 <on_enable function="Edit.EnableCustomizeAvatar" />
261 </menu_item_call> 261 </menu_item_call>
262 <menu_item_call bottom="-362" enabled="true" height="19" label="Display Name..." left="0"
263 mouse_opaque="true" name="Display Name..." width="153">
264 <on_click function="ShowFloater" userdata="displayname" />
265 <on_enable function="Edit.EnableDisplayName" />
266 </menu_item_call>
262 <menu_item_separator /> 267 <menu_item_separator />
263 <menu_item_check name="Friends" label="Friends" 268 <menu_item_check name="Friends" label="Friends"
264 shortcut="control|shift|F"> 269 shortcut="control|shift|F">
@@ -267,7 +272,8 @@
267 <on_check function="FloaterVisible" 272 <on_check function="FloaterVisible"
268 userdata="friends" /> 273 userdata="friends" />
269 </menu_item_check> 274 </menu_item_check>
270 <menu_item_call name="Groups" label="Groups"> 275 <menu_item_call name="Groups" label="Groups"
276 shortcut="control|shift|G">
271 <on_click function="ShowAgentGroups" 277 <on_click function="ShowAgentGroups"
272 userdata="agent" /> 278 userdata="agent" />
273 </menu_item_call> 279 </menu_item_call>
@@ -1965,6 +1971,13 @@
1965 <on_click function="Advanced.DumpAttachments" 1971 <on_click function="Advanced.DumpAttachments"
1966 userdata="" /> 1972 userdata="" />
1967 </menu_item_call> 1973 </menu_item_call>
1974 <menu_item_call
1975 label="Reload Avatar Cloud Particle"
1976 name="Reload Avatar Cloud Particle">
1977 <on_click
1978 function="Advanced.ReloadAvatarCloudParticle"
1979 userdata="" />
1980 </menu_item_call>
1968 </menu> 1981 </menu>
1969 1982
1970 <!-- CRASH --> 1983 <!-- CRASH -->
diff --git a/linden/indra/newview/skins/default/xui/en-us/mime_types_windows.xml b/linden/indra/newview/skins/default/xui/en-us/mime_types_windows.xml
index 61067da..5ee4ed0 100644
--- a/linden/indra/newview/skins/default/xui/en-us/mime_types_windows.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/mime_types_windows.xml
@@ -142,7 +142,7 @@
142 audio 142 audio
143 </widgettype> 143 </widgettype>
144 <impl> 144 <impl>
145 media_plugin_quicktime 145 media_plugin_gstreamer010
146 </impl> 146 </impl>
147 </mimetype> 147 </mimetype>
148 <mimetype name="video/*"> 148 <mimetype name="video/*">
@@ -197,8 +197,8 @@
197 audio 197 audio
198 </widgettype> 198 </widgettype>
199 <impl> 199 <impl>
200 media_plugin_quicktime 200 media_plugin_gstreamer010
201 </impl> 201 </impl>
202 </mimetype> 202 </mimetype>
203 <mimetype name="application/pdf"> 203 <mimetype name="application/pdf">
204 <label name="application/pdf_label"> 204 <label name="application/pdf_label">
@@ -274,8 +274,8 @@
274 audio 274 audio
275 </widgettype> 275 </widgettype>
276 <impl> 276 <impl>
277 media_plugin_quicktime 277 media_plugin_gstreamer010
278 </impl> 278 </impl>
279 </mimetype> 279 </mimetype>
280 <mimetype name="audio/mpeg"> 280 <mimetype name="audio/mpeg">
281 <label name="audio/mpeg_label"> 281 <label name="audio/mpeg_label">
@@ -285,8 +285,8 @@
285 audio 285 audio
286 </widgettype> 286 </widgettype>
287 <impl> 287 <impl>
288 media_plugin_quicktime 288 media_plugin_gstreamer010
289 </impl> 289 </impl>
290 </mimetype> 290 </mimetype>
291 <mimetype name="audio/x-aiff"> 291 <mimetype name="audio/x-aiff">
292 <label name="audio/x-aiff_label"> 292 <label name="audio/x-aiff_label">
@@ -296,8 +296,8 @@
296 audio 296 audio
297 </widgettype> 297 </widgettype>
298 <impl> 298 <impl>
299 media_plugin_quicktime 299 media_plugin_gstreamer010
300 </impl> 300 </impl>
301 </mimetype> 301 </mimetype>
302 <mimetype name="audio/x-wav"> 302 <mimetype name="audio/x-wav">
303 <label name="audio/x-wav_label"> 303 <label name="audio/x-wav_label">
@@ -307,8 +307,8 @@
307 audio 307 audio
308 </widgettype> 308 </widgettype>
309 <impl> 309 <impl>
310 media_plugin_quicktime 310 media_plugin_gstreamer010
311 </impl> 311 </impl>
312 </mimetype> 312 </mimetype>
313 <mimetype menu="1" name="image/bmp"> 313 <mimetype menu="1" name="image/bmp">
314 <label name="image/bmp_label"> 314 <label name="image/bmp_label">
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index be29df8..358dbbf 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -3194,30 +3194,11 @@ Type a short announcement which will be sent to everyone currently in your estat
3194 3194
3195<notification 3195<notification
3196 icon="alert.tga" 3196 icon="alert.tga"
3197 label="Change Linden Estate" 3197 label="Pfft some old linden crap"
3198 name="ChangeLindenEstate" 3198 name="PfftLindenCrap"
3199 type="alert"> 3199 type="alert">
3200You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.). 3200This used to be some Linden inspired crap, but should never be seen now.
3201 3201Still unravelling the code before I make this go away.
3202This is EXTREMELY DANGEROUS because it can fundamentally affect the user experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
3203
3204Proceed?
3205 <usetemplate
3206 name="okcancelbuttons"
3207 notext="Cancel"
3208 yestext="OK"/>
3209</notification>
3210
3211<notification
3212 icon="alert.tga"
3213 label="Change Linden Estate Access"
3214 name="ChangeLindenAccess"
3215 type="alert">
3216You are about to change the access list for a Linden owned estate (mainland, teen grid, orientation, etc.).
3217
3218This is DANGEROUS and should only be done to invoke the hack allowing objects/[CURRENCY] to be transfered in/out of a grid.
3219
3220It will change thousands of regions and make the spaceserver hiccup.
3221 <usetemplate 3202 <usetemplate
3222 name="okcancelbuttons" 3203 name="okcancelbuttons"
3223 notext="Cancel" 3204 notext="Cancel"
@@ -5237,6 +5218,88 @@ The string [STRING_NAME] is missing from strings.xml
5237</notification> 5218</notification>
5238 5219
5239<notification 5220<notification
5221 icon="alertmodal.tga"
5222 name="SetDisplayNameSuccess"
5223 type="alert">
5224Hi [DISPLAY_NAME]!
5225
5226Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for your name to update in objects, scripts, search, etc.
5227 </notification>
5228
5229 <notification
5230 icon="alertmodal.tga"
5231 name="SetDisplayNameBlocked"
5232 type="alert">
5233Sorry, you cannot change your display name. If you feel this is in error, please contact support.
5234 </notification>
5235
5236 <notification
5237 icon="alertmodal.tga"
5238 name="SetDisplayNameFailedLength"
5239 type="alertmodal">
5240Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
5241
5242Please try a shorter name.
5243 </notification>
5244
5245 <notification
5246 icon="alertmodal.tga"
5247 name="SetDisplayNameFailedGeneric"
5248 type="alertmodal">
5249 Sorry, we could not set your display name. Please try again later.
5250 </notification>
5251
5252 <notification
5253 icon="alertmodal.tga"
5254 name="SetDisplayNameMismatch"
5255 type="alertmodal">
5256 The display names you entered do not match. Please re-enter.
5257 </notification>
5258
5259 <!-- *NOTE: This should never happen -->
5260 <notification
5261 icon="alertmodal.tga"
5262 name="AgentDisplayNameUpdateThresholdExceeded"
5263 type="alertmodal">
5264Sorry, you have to wait longer before you can change your display name.
5265
5266See http://wiki.secondlife.com/wiki/Setting_your_display_name
5267
5268Please try again later.
5269 </notification>
5270
5271 <notification
5272 icon="alertmodal.tga"
5273 name="AgentDisplayNameSetBlocked"
5274 type="alertmodal">
5275 Sorry, we could not set your requested name because it contains a banned word.
5276
5277 Please try a different name.
5278 </notification>
5279
5280 <notification
5281 icon="alertmodal.tga"
5282 name="AgentDisplayNameSetInvalidUnicode"
5283 type="alertmodal">
5284 The display name you wish to set contains invalid characters.
5285 </notification>
5286
5287 <notification
5288 icon="alertmodal.tga"
5289 name="AgentDisplayNameSetOnlyPunctuation"
5290 type="alertmodal">
5291 Your display name must contain letters other than punctuation.
5292 </notification>
5293
5294
5295 <notification
5296 icon="notifytip.tga"
5297 name="DisplayNameUpdate"
5298 type="notifytip">
5299 [OLD_NAME] ([SLID]) is now known as [NEW_NAME].
5300 </notification>
5301
5302<notification
5240 icon="notifytip.tga" 5303 icon="notifytip.tga"
5241 name="Cancelled" 5304 name="Cancelled"
5242 type="notifytip"> 5305 type="notifytip">
@@ -5657,9 +5720,9 @@ If you want to view streaming media on parcels that support it you should go to
5657No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable. 5720No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable.
5658</notification> 5721</notification>
5659<notification 5722<notification
5660 icon="alertmodal.tga" 5723 icon="alert.tga"
5661 name="MediaPluginFailed" 5724 name="MediaPluginFailed"
5662 type="alertmodal"> 5725 type="alert">
5663The following Media Plugin has failed: 5726The following Media Plugin has failed:
5664[PLUGIN] 5727[PLUGIN]
5665 5728
@@ -6874,7 +6937,7 @@ GRAVITY -- -9.8
6874 6937
6875* -- Multiplication 6938* -- Multiplication
6876\ -- Division 6939\ -- Division
6877+ -- Addition 6940 -- Addition
6878- -- Subtraction 6941- -- Subtraction
6879 6942
6880For information about this feature, click "More Info". 6943For information about this feature, click "More Info".
@@ -6903,7 +6966,7 @@ GLOW -- Glow
6903 6966
6904* -- Multiplication 6967* -- Multiplication
6905\ -- Division 6968\ -- Division
6906+ -- Addition 6969 -- Addition
6907- -- Subtraction 6970- -- Subtraction
6908 6971
6909For information about this feature, click "More Info". 6972For information about this feature, click "More Info".
@@ -7221,6 +7284,24 @@ Apply this region's settings? (&quot;Ignore&quot; will ignore all region setting
7221The new font will appear after you restart [VIEWER_NAME]. 7284The new font will appear after you restart [VIEWER_NAME].
7222</notification> 7285</notification>
7223 7286
7287<notification
7288 icon="alertmodal.tga"
7289 name="FirstPrivacy"
7290 type="alertmodal">
7291Terms of service of the grid you are connecting to require sending a "statistics packet" every 5 minutes.
7292That is for example: Data about your hardware (CPU, RAM), number of avatars around, number of sims visited.
7293Please check *the grids* privacy policy about usage of that data.
7294 <form name="form">
7295 <button
7296 index="0"
7297 name="ok"
7298 text="Login anyway"/>
7299 <button
7300 index="1"
7301 name="notok"
7302 text="Do not log in"/>
7303 </form>
7304</notification>
7224 7305
7225<!--End Imprudence notifications--> 7306<!--End Imprudence notifications-->
7226 <!-- [KITTY VIEWER] --> 7307 <!-- [KITTY VIEWER] -->
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
index 38c5a98..2db2595 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
@@ -127,6 +127,11 @@
127 font="SansSerifSmall" height="16" is_unicode="false" left="12" 127 font="SansSerifSmall" height="16" is_unicode="false" left="12"
128 max_length="254" mouse_opaque="false" name="name" 128 max_length="254" mouse_opaque="false" name="name"
129 width="155" /> 129 width="155" />
130 <name_editor bevel_style="in" border_style="line" visible="false"
131 border_thickness="1" bottom="-24" enabled="false" follows="left|top"
132 font="SansSerifSmall" height="16" is_unicode="false" left_delta="0"
133 max_length="254" mouse_opaque="false" name="complete_name"
134 width="155" />
130 <button bottom_delta="0" font="SansSerif" halign="center" height="20" 135 <button bottom_delta="0" font="SansSerif" halign="center" height="20"
131 label="Copy Key" label_selected="Copy Key" 136 label="Copy Key" label_selected="Copy Key"
132 left_delta="157" mouse_opaque="true" name="btn_copy_uuid" width="80" /> 137 left_delta="157" mouse_opaque="true" name="btn_copy_uuid" width="80" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
index 4b0b292..6ced7d6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
@@ -2,6 +2,15 @@
2<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom" 2<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
3 height="408" label="General" left="102" mouse_opaque="true" 3 height="408" label="General" left="102" mouse_opaque="true"
4 name="general_panel" width="517"> 4 name="general_panel" width="517">
5 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
6 bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
7 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
8 mouse_opaque="true" name="start_location_textbox" v_pad="0" width="394">
9 Start Location:
10 </text>
11 <string name="region_name_prompt">
12 &lt;Type region name&gt;
13 </string>
5 <combo_box name="default_location_combo" 14 <combo_box name="default_location_combo"
6 bottom="-22" left="155" height="16" width="150" 15 bottom="-22" left="155" height="16" width="150"
7 follows="left|top" font="SansSerifSmall" 16 follows="left|top" font="SansSerifSmall"
@@ -24,7 +33,13 @@
24 font="SansSerifSmall" height="16" initial_value="true" 33 font="SansSerifSmall" height="16" initial_value="true"
25 label="Show start location at login screen" left="151" mouse_opaque="true" 34 label="Show start location at login screen" left="151" mouse_opaque="true"
26 name="show_location_checkbox" radio_style="false" width="256" /> 35 name="show_location_checkbox" radio_style="false" width="256" />
27 <combo_box bottom_delta="-25" follows="left|top" height="18" left="155" 36 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
37 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
38 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
39 mouse_opaque="true" name="show_names_textbox" v_pad="0" width="394">
40 Nametags:
41 </text>
42 <combo_box bottom_delta="0" follows="left|top" height="18" left="155"
28 mouse_opaque="true" name="fade_out_combobox" width="146"> 43 mouse_opaque="true" name="fade_out_combobox" width="146">
29 <combo_item name="Never" value="Never"> 44 <combo_item name="Never" value="Never">
30 Never show 45 Never show
@@ -44,11 +59,35 @@
44 font="SansSerifSmall" height="16" initial_value="false" 59 font="SansSerifSmall" height="16" initial_value="false"
45 label="Hide my name on my screen" left="151" name="show_my_name_checkbox" 60 label="Hide my name on my screen" left="151" name="show_my_name_checkbox"
46 width="200" /> 61 width="200" />
62
47 <check_box bottom_delta="-20" follows="left|top" 63 <check_box bottom_delta="-20" follows="left|top"
48 font="SansSerifSmall" height="16" initial_value="false" 64 font="SansSerifSmall" height="16" initial_value="false"
49 label="Highlight friends tags" left="151" name="highlight_friends_checkbox" 65 label="Highlight friends tags" left="151" name="highlight_friends_checkbox"
50 width="200" /> 66 width="200" />
51 <text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0" 67 <text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0"
68 halign="left" height="16" left="10" name="Display_Names_textbox" v_pad="0"
69 width="394">
70 Display Names:
71 </text>
72 <radio_group name="displaynames" draw_border="false"
73 bottom_delta="0" left_delta="60" height="18"
74 follows="top|left"
75 control_name="DisplayNamesUsage">
76 <radio_item name="0" bottom_delta="-8" left_delta="40" height="18">
77 Legacy Names
78 </radio_item>
79 <radio_item name="1" bottom_delta="0" left_delta="50" height="18">
80 Display Names
81 </radio_item>
82 <radio_item name="2" bottom_delta="0" left_delta="50" height="18">
83 Show Both
84 </radio_item>
85 </radio_group>
86 <check_box bottom_delta="-20" follows="left|top" control_name="LegacyNamesForFriends"
87 font="SansSerifSmall" height="16" initial_value="false"
88 label="Show legacy names for friends" left="151" name="legacy_friends_checkbox"
89 width="200" />
90 <text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0"
52 halign="left" height="16" left="10" name="group_titles_textbox" v_pad="0" 91 halign="left" height="16" left="10" name="group_titles_textbox" v_pad="0"
53 width="394"> 92 width="394">
54 Group Titles: 93 Group Titles:
@@ -61,37 +100,49 @@
61 font="SansSerifSmall" height="16" initial_value="false" 100 font="SansSerifSmall" height="16" initial_value="false"
62 label="Hide my group title" left="330" name="show_my_title_checkbox" 101 label="Hide my group title" left="330" name="show_my_title_checkbox"
63 radio_style="false" width="256" /> 102 radio_style="false" width="256" />
64 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-210" 103 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
104 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
105 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
106 mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
107 Selection Beam Color:
108 </text>
109 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-44"
65 can_apply_immediately="false" color="1 1 1 1" 110 can_apply_immediately="false" color="1 1 1 1"
66 enabled="true" follows="left|top" height="65" label="" left="153" 111 enabled="true" follows="left|top" height="55" label="" left="153"
67 mouse_opaque="true" name="effect_color_swatch" 112 mouse_opaque="true" name="effect_color_swatch"
68 tool_tip="Click to open Color Picker" width="55" /> 113 tool_tip="Click to open Color Picker" width="45" />
69 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 114 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
70 bottom="-215" drop_shadow_visible="true" enabled="true" follows="left|top" 115 bottom_delta="-18" drop_shadow_visible="true" enabled="true" follows="left|top"
71 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10" 116 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
72 mouse_opaque="true" name="UI Size:" v_pad="0" width="128"> 117 mouse_opaque="true" name="UI Size:" v_pad="0" width="128">
73 UI Size: 118 UI Size:
74 </text> 119 </text>
75 <slider bottom="-217" can_edit_text="true" 120 <slider bottom_delta="42" can_edit_text="true"
76 decimal_digits="3" enabled="true" height="16" increment="0.001" 121 decimal_digits="3" enabled="true" height="16" increment="0.001"
77 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true" 122 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true"
78 name="ui_scale_slider" show_text="true" value="1" width="220" /> 123 name="ui_scale_slider" show_text="true" value="1" width="220" />
79 <button bottom="-221" enabled="true" follows="left|top" 124 <button bottom_delta="-48" enabled="true" follows="left|top"
80 font="SansSerif" halign="center" height="22" label="Reset" 125 font="SansSerif" halign="center" height="22" label="Reset"
81 label_selected="Reset" left_delta="226" mouse_opaque="true" 126 label_selected="Reset" left_delta="226" mouse_opaque="true"
82 name="reset_ui_size" scale_image="true" width="80" /> 127 name="reset_ui_size" scale_image="true" width="80" />
83 <check_box bottom="-236" enabled="true" follows="left|top" 128 <check_box bottom_delta="-14" enabled="true" follows="left|top"
84 font="SansSerifSmall" height="16" initial_value="false" 129 font="SansSerifSmall" height="16" initial_value="false"
85 label="Use resolution independent scale" left="151" mouse_opaque="true" 130 label="Use resolution independent scale" left="151" mouse_opaque="true"
86 name="ui_auto_scale" radio_style="false" width="256" /> 131 name="ui_auto_scale" radio_style="false" width="256" />
87 <check_box bottom="-260" enabled="true" follows="left|top" 132 <spinner bottom_delta="-24" decimal_digits="0" enabled="true"
88 font="SansSerifSmall" height="16" initial_value="false"
89 label="Go Away/AFK when idle" left="330" mouse_opaque="true"
90 name="afk_timeout_checkbox" radio_style="false" width="256" />
91 <spinner bottom="-260" decimal_digits="0" enabled="true"
92 follows="left|top" height="16" increment="1" initial_val="300" 133 follows="left|top" height="16" increment="1" initial_val="300"
93 label="Away Timeout:" label_width="141" left="10" max_val="600" 134 label="Away Timeout:" label_width="141" left="10" max_val="600"
94 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" /> 135 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" />
136 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
137 bottom_delta="6" drop_shadow_visible="true" enabled="true" follows="left|top"
138 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="220"
139 mouse_opaque="true" name="seconds_textbox" v_pad="0" width="128">
140 seconds
141 </text>
142 <check_box bottom_delta="-5" enabled="true" follows="left|top"
143 font="SansSerifSmall" height="16" initial_value="false"
144 label="Go Away/AFK when idle" left="330" mouse_opaque="true"
145 name="afk_timeout_checkbox" radio_style="false" width="256" />
95 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 146 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
96 bottom_delta="-27" drop_shadow_visible="true" enabled="true" follows="left|top" 147 bottom_delta="-27" drop_shadow_visible="true" enabled="true" follows="left|top"
97 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10" 148 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
@@ -109,18 +160,18 @@
109 mouse_opaque="true" name="mini_map_notify_sim" radio_style="false" 160 mouse_opaque="true" name="mini_map_notify_sim" radio_style="false"
110 width="256" /> 161 width="256" />
111 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 162 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
112 bottom="-312" drop_shadow_visible="true" enabled="true" follows="left|top" 163 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
113 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10" 164 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
114 mouse_opaque="true" name="maturity_desired_label" v_pad="0" width="394"> 165 mouse_opaque="true" name="maturity_desired_label" v_pad="0" width="394">
115 Rating: 166 Rating:
116 </text> 167 </text>
117 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 168 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
118 bottom="-312" drop_shadow_visible="true" enabled="true" follows="left|top" 169 bottom_delta="0" drop_shadow_visible="true" enabled="true" follows="left|top"
119 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="151" 170 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="151"
120 mouse_opaque="true" name="maturity_desired_prompt" v_pad="0" width="394"> 171 mouse_opaque="true" name="maturity_desired_prompt" v_pad="0" width="394">
121 I want to access content rated: 172 I want to access content rated:
122 </text> 173 </text>
123 <combo_box bottom="-318" follows="left|top" height="18" left="315" 174 <combo_box bottom_delta="-6" follows="left|top" height="18" left="315"
124 mouse_opaque="true" name="maturity_desired_combobox" width="150"> 175 mouse_opaque="true" name="maturity_desired_combobox" width="150">
125 <combo_item name="Desired_Adult" value="42"> 176 <combo_item name="Desired_Adult" value="42">
126 PG, Mature and Adult 177 PG, Mature and Adult
@@ -133,58 +184,20 @@
133 </combo_item> 184 </combo_item>
134 </combo_box> 185 </combo_box>
135 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 186 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
136 bottom="-312" drop_shadow_visible="true" enabled="true" follows="left|top" 187 bottom_delta="0" drop_shadow_visible="true" enabled="true" follows="left|top"
137 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="315" 188 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="315"
138 mouse_opaque="true" name="maturity_desired_textbox" v_pad="0" width="150"> 189 mouse_opaque="true" name="maturity_desired_textbox" v_pad="0" width="150">
139 PG only 190 PG only
140 </text> 191 </text>
192
193
141 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 194 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
142 bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top" 195 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
143 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
144 mouse_opaque="true" name="start_location_textbox" v_pad="0" width="394">
145 Start Location:
146 </text>
147 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
148 bottom="-64" drop_shadow_visible="true" enabled="true" follows="left|top"
149 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
150 mouse_opaque="true" name="show_names_textbox" v_pad="0" width="394">
151 Nametags:
152 </text>
153 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
154 bottom="-155" drop_shadow_visible="true" enabled="true" follows="left|top"
155 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
156 mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
157 Selection Beam Color:
158 </text>
159 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
160 bottom="-254" drop_shadow_visible="true" enabled="true" follows="left|top"
161 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="220"
162 mouse_opaque="true" name="seconds_textbox" v_pad="0" width="128">
163 seconds
164 </text>
165 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
166 bottom="-352" drop_shadow_visible="true" enabled="true" follows="left|top"
167 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10" 196 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
168 mouse_opaque="true" name="time_textbox" v_pad="0" width="394"> 197 mouse_opaque="true" name="time_textbox" v_pad="0" width="394">
169 Clock: 198 Clock:
170 </text> 199 </text>
171 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 200 <combo_box allow_text_entry="false" bottom_delta="0" enabled="true" follows="left|top"
172 bottom="-384" drop_shadow_visible="true" enabled="true" follows="left|top"
173 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
174 mouse_opaque="true" name="language_textbox" v_pad="0" width="394">
175 Language:
176 </text>
177 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
178 bottom_delta="-1" drop_shadow_visible="true" enabled="true"
179 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
180 height="18" left_delta="293" mouse_opaque="true" name="language_textbox2"
181 v_pad="0" width="400">
182 (requires restart for full effect)
183 </text>
184 <string name="region_name_prompt">
185 &lt;Type region name&gt;
186 </string>
187 <combo_box allow_text_entry="false" bottom="-352" enabled="true" follows="left|top"
188 height="18" left="153" max_chars="20" mouse_opaque="true" 201 height="18" left="153" max_chars="20" mouse_opaque="true"
189 name="time_combobox" width="146"> 202 name="time_combobox" width="146">
190 <combo_item type="string" name="12HourTime" value="PST 12"> 203 <combo_item type="string" name="12HourTime" value="PST 12">
@@ -197,7 +210,13 @@
197 UTC 210 UTC
198 </combo_item> 211 </combo_item>
199 </combo_box> 212 </combo_box>
200 <combo_box allow_text_entry="true" bottom="-382" enabled="true" 213 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
214 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
215 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
216 mouse_opaque="true" name="language_textbox" v_pad="0" width="394">
217 Language:
218 </text>
219 <combo_box allow_text_entry="true" bottom_delta="0" enabled="true"
201 follows="left|top" height="16" left="153" max_chars="135" 220 follows="left|top" height="16" left="153" max_chars="135"
202 mouse_opaque="true" name="language_combobox" width="146"> 221 mouse_opaque="true" name="language_combobox" width="146">
203 <combo_item type="string" length="1" enabled="true" name="System Default Language" value="default"> 222 <combo_item type="string" length="1" enabled="true" name="System Default Language" value="default">
@@ -255,5 +274,11 @@
255 한국어 (Korean) - Beta 274 한국어 (Korean) - Beta
256 </combo_item> 275 </combo_item>
257 </combo_box> 276 </combo_box>
258 277 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
278 bottom_delta="0" drop_shadow_visible="true" enabled="true"
279 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
280 height="18" left_delta="150" mouse_opaque="true" name="language_textbox2"
281 v_pad="0" width="400">
282 (requires restart for full effect)
283 </text>
259</panel> 284</panel>
diff --git a/linden/indra/newview/skins/default/xui/es/notifications.xml b/linden/indra/newview/skins/default/xui/es/notifications.xml
index f39dfc9..f3a862d 100644
--- a/linden/indra/newview/skins/default/xui/es/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/es/notifications.xml
@@ -1454,21 +1454,6 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re
1454 <button name="Cancel" text="Cancelar"/> 1454 <button name="Cancel" text="Cancelar"/>
1455 </form> 1455 </form>
1456 </notification> 1456 </notification>
1457 <notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
1458 Va a hacer cambios en un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
1459
1460Esto es EXTREMADAMENTE PELIGROSO, porque puede afectar radicalmente al funcionamiento de los usuarios. En mainland, se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
1461
1462¿Proceder?
1463 <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
1464 </notification>
1465 <notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
1466 Va a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
1467
1468Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
1469Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
1470 <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
1471 </notification>
1472 <notification label="Seleccionar el estado" name="EstateAllowedAgentAdd"> 1457 <notification label="Seleccionar el estado" name="EstateAllowedAgentAdd">
1473 ¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]? 1458 ¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
1474 <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> 1459 <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
diff --git a/linden/indra/newview/skins/default/xui/fr/notifications.xml b/linden/indra/newview/skins/default/xui/fr/notifications.xml
index 6911f8b..dc7e61f 100644
--- a/linden/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1425,21 +1425,6 @@ Pour quitter un groupe, sélectionnez l&apos;option Groupe dans le menu Éditer.
1425 <button name="Cancel" text="Annuler"/> 1425 <button name="Cancel" text="Annuler"/>
1426 </form> 1426 </form>
1427 </notification> 1427 </notification>
1428 <notification label="Modifier un domaine Linden" name="ChangeLindenEstate">
1429 Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.).
1430
1431Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur.
1432
1433Continuer ?
1434 <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
1435 </notification>
1436 <notification label="Modifier l&apos;accès à un domaine Linden" name="ChangeLindenAccess">
1437 Vous vous apprêtez à modifier la liste d&apos;accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.).
1438
1439Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l&apos;intérieur/extérieur de la grille.
1440Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur.
1441 <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
1442 </notification>
1443 <notification label="Choisir le domaine" name="EstateAllowedAgentAdd"> 1428 <notification label="Choisir le domaine" name="EstateAllowedAgentAdd">
1444 Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? 1429 Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
1445 <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> 1430 <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
diff --git a/linden/indra/newview/skins/default/xui/hu/notifications.xml b/linden/indra/newview/skins/default/xui/hu/notifications.xml
index bf41284..6bc188d 100644
--- a/linden/indra/newview/skins/default/xui/hu/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/hu/notifications.xml
@@ -1317,19 +1317,6 @@ A csoportból való kilépéshez válaszd a &apos;Csoportok...&apos; részt a &a
1317 <notification label="Üzenetküldés mindenki számára a telkeden" name="MessageEstate"> 1317 <notification label="Üzenetküldés mindenki számára a telkeden" name="MessageEstate">
1318 Rövid bejelentés írása, amely elküldésre mindenki részére, aki az ingatlanodon tartózkodik. 1318 Rövid bejelentés írása, amely elküldésre mindenki részére, aki az ingatlanodon tartózkodik.
1319 </notification> 1319 </notification>
1320 <notification label="Linden telek változtatása" name="ChangeLindenEstate">
1321 Linden tulajdonú telek változtatása folyamatban (mainland, teen grid, orientation, stb.).
1322
1323Ez NAGYON VESZÉLYES, mivel kihatással van a felhasználók megszokásaira. A mainland-en ez régiók ezreit befolyásolja, amely a &apos;spaceserver&apos; működésében akadályokat okoz.
1324
1325Folytatod?
1326 </notification>
1327 <notification label="Linden telek belépésének változtatása" name="ChangeLindenAccess">
1328 Linden tulajdonú telek változtatása folyamatban (mainland, teen grid, orientation, stb.).
1329
1330This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid.
1331A mainland-en ez régiók ezreit befolyásolja, amely a &apos;spaceserver&apos; működésében akadályokat okoz.
1332 </notification>
1333 <notification label="Ingatlan kiválasztása" name="EstateAllowedAgentAdd"> 1320 <notification label="Ingatlan kiválasztása" name="EstateAllowedAgentAdd">
1334 Engedélyezettek listájához való hozzáadása csak ennek az ingatlan vagy [ALL_ESTATES] esetén? 1321 Engedélyezettek listájához való hozzáadása csak ennek az ingatlan vagy [ALL_ESTATES] esetén?
1335 </notification> 1322 </notification>
diff --git a/linden/indra/newview/skins/default/xui/it/notifications.xml b/linden/indra/newview/skins/default/xui/it/notifications.xml
index 61aafae..039a6d1 100644
--- a/linden/indra/newview/skins/default/xui/it/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/it/notifications.xml
@@ -1452,21 +1452,6 @@ Per abbandonare un gruppo seleziona l&apos;opzione &apos;Gruppi..&apos; dal menu
1452 <button name="Cancel" text="Annulla"/> 1452 <button name="Cancel" text="Annulla"/>
1453 </form> 1453 </form>
1454 </notification> 1454 </notification>
1455 <notification label="Cambia la tipologia della proprietà Linden" name="ChangeLindenEstate">
1456 Stai per cambiare la tipologia della proprietà Linden (mainland, griglia minorenni, orientamento, ecc.).
1457
1458Questo è ESTREMAMENTE PERICOLOSO perchè può cambiare radicalmente l&apos;esperienza degli utenti. Sulla mainland cambierà migliaia di regioni e produrrà seri problemi ai vari server.
1459
1460Confermi?
1461 <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
1462 </notification>
1463 <notification label="Cambia la tipologia Linden di accesso alla proprietà" name="ChangeLindenAccess">
1464 Stai per cambiare la lista di accesso per una proprietà Linden (mainland, griglia minorenni, orientamento, ecc.).
1465
1466Questo è PERICOLOSO e dovrebbe essere fatto soltanto per poter lanciare il programma che consente agli oggetti/L$ di essere trasferiti fra griglie diverse.
1467Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
1468 <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
1469 </notification>
1470 <notification label="Seleziona la proprietà" name="EstateAllowedAgentAdd"> 1455 <notification label="Seleziona la proprietà" name="EstateAllowedAgentAdd">
1471 Aggiungi alla lista di accesso solo per questa proprietà oppure per [ALL_ESTATES]? 1456 Aggiungi alla lista di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
1472 <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/> 1457 <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
diff --git a/linden/indra/newview/skins/default/xui/ja/notifications.xml b/linden/indra/newview/skins/default/xui/ja/notifications.xml
index 6da6ccc..fa63cf0 100644
--- a/linden/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1526,21 +1526,6 @@ F1キーを押してください。
1526 <button name="Cancel" text="取り消し"/> 1526 <button name="Cancel" text="取り消し"/>
1527 </form> 1527 </form>
1528 </notification> 1528 </notification>
1529 <notification label="Lindenの不動産を変更" name="ChangeLindenEstate">
1530 あなたはLinden所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)を変更しようとしています。
1531
1532これはユーザーの経験を根本から揺るがしかねない「非常に危険な行為」です。これにより、メインランドで多数の地域が変更され、スペースサーバーに悪影響が生じます。
1533
1534操作を続行しますか?
1535 <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
1536 </notification>
1537 <notification label="Lindenの不動産へのアクセスを変更" name="ChangeLindenAccess">
1538 あなたはLinden所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)へのアクセスリストを変更しようとしています。
1539
1540この行為は「危険」であり、グリッドからオブジェクトやお金の転送をもたらすハッキングを引き起こす可能性があるため、完全にそれを意図した場合のみ行うべきものです。
1541これにより多数の地域が変更され、スペースサーバーに悪影響が生じます。
1542 <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
1543 </notification>
1544 <notification label="不動産を選択" name="EstateAllowedAgentAdd"> 1529 <notification label="不動産を選択" name="EstateAllowedAgentAdd">
1545 この不動産の許可リストだけに追加しますか? それとも[ALL_ESTATES]のすべての許可リストに追加しますか? 1530 この不動産の許可リストだけに追加しますか? それとも[ALL_ESTATES]のすべての許可リストに追加しますか?
1546 <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/> 1531 <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
diff --git a/linden/indra/newview/skins/default/xui/ko/notifications.xml b/linden/indra/newview/skins/default/xui/ko/notifications.xml
index cb720ed..20c57a1 100644
--- a/linden/indra/newview/skins/default/xui/ko/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/ko/notifications.xml
@@ -2941,43 +2941,7 @@ Applications 폴더에 다운로드하시겠습니까?
2941 </form> 2941 </form>
2942 </notification> 2942 </notification>
2943 2943
2944 <notification
2945
2946 label="린든 사유지 변경"
2947 name="ChangeLindenEstate"
2948 >
2949귀하께서는 린든 소유의 사유지(메인랜드, 틴 그리드, 오리엔테이션 등)를
2950변경하려고 합니다.
2951
2952이렇게 하면 기본적으로 사용자가 게임을 즐기는 데 영향을
2953줄 수 있으므로 매우 위험합니다. 또한 메인랜드에서 수천가지의 지역이 변경되고
2954공간 서버가 일시적으로 중단될 수도 있습니다.
2955
2956계속하시겠습니까?
2957 <usetemplate
2958 name="okcancelbuttons"
2959 notext="취소"
2960 yestext="사유지 변경"/>
2961 </notification>
2962 2944
2963 <notification
2964
2965 label="린든 사유지 액세스 변경"
2966 name="ChangeLindenAccess"
2967 >
2968귀하께서는 린든 소유의 사유지(메인랜드, 틴 그리드, 오리엔테이션 등)에 대한
2969접근 목록을 변경하려고 합니다.
2970
2971이는 위험한 작업이며 오브젝트/금액을 그리드에서 송수신할 수 있도록
2972핵을 불러내는 경우에만 수행할 수
2973있습니다.
2974이렇게 하면 수천가지의 지역이 변경되고
2975공간 서버가 일시적으로 중단될 수도 있습니다.
2976 <usetemplate
2977 name="okcancelbuttons"
2978 notext="취소"
2979 yestext="사유지 변경"/>
2980 </notification>
2981 2945
2982 <notification 2946 <notification
2983 2947
diff --git a/linden/indra/newview/skins/default/xui/pl/notifications.xml b/linden/indra/newview/skins/default/xui/pl/notifications.xml
index 38a4b56..4c8ee5c 100644
--- a/linden/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/pl/notifications.xml
@@ -1434,23 +1434,6 @@ Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej g
1434 <button name="Cancel" text="Anuluj"/> 1434 <button name="Cancel" text="Anuluj"/>
1435 </form> 1435 </form>
1436 </notification> 1436 </notification>
1437 <notification label="Zmiana Majątku Lindenów" name="ChangeLindenEstate">
1438 Dokonujesz zmiany w Regionie Głównym należącym do Lindenów (Regiony Główne, Teen Grid, Orientacja).
1439
1440Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie. Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów.
1441
1442Kontynuować?
1443 <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
1444 </notification>
1445 <notification label="Zmiana Dostępu do Majątku Lindenów" name="ChangeLindenAccess">
1446 Dokonujesz zmiany w liście dostępu Regionu Głównego należącego do Lindenów (Regiony Główne, Teen Grid, Orientacja).
1447
1448Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/z sieci.
1449Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów.
1450
1451Kontynuować?
1452 <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
1453 </notification>
1454 <notification label="Wybierz Majątek" name="EstateAllowedAgentAdd"> 1437 <notification label="Wybierz Majątek" name="EstateAllowedAgentAdd">
1455 Dodać do listy dostępu do tego majątku czy do [ALL_ESTATES]? 1438 Dodać do listy dostępu do tego majątku czy do [ALL_ESTATES]?
1456 <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> 1439 <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
diff --git a/linden/indra/newview/skins/default/xui/pt/notifications.xml b/linden/indra/newview/skins/default/xui/pt/notifications.xml
index 71903c1..a026c59 100644
--- a/linden/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/pt/notifications.xml
@@ -1434,21 +1434,6 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
1434 <button name="Cancel" text="Cancelar"/> 1434 <button name="Cancel" text="Cancelar"/>
1435 </form> 1435 </form>
1436 </notification> 1436 </notification>
1437 <notification label="Mudar propriedade Linden" name="ChangeLindenEstate">
1438 Você está prestes a mudar uma propriedade pertencente a Linden (continente, teen grid, orientação, etc.)
1439
1440Isto é EXTREMAMENTE PERIGOSO porque pode fundamentalmente afetar a experiência do usuário. No continente, vai mudar milhares de regiões e fazer o spaceserver soluçar.
1441
1442Proceder?
1443 <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Mudar Propriedade"/>
1444 </notification>
1445 <notification label="Mudar o acesso à propriedade Linden" name="ChangeLindenAccess">
1446 Você está prestes a mudar a lista de acessos de uma propriedade pertencente a Linden (continente, teen grid, orientação, etc.).
1447
1448Isto é PERIGOSO e deveria ser feito apenas para utilizar uma brecha que permita que objetos/L$ sejam transferidos para dentro/fora da grade.
1449Isto mudará milhares de regiões e fará o spaceserver soluçar.
1450 <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
1451 </notification>
1452 <notification label="Selecione a propriedade" name="EstateAllowedAgentAdd"> 1437 <notification label="Selecione a propriedade" name="EstateAllowedAgentAdd">
1453 Adicionar à lista de permitidos somente para esta propriedade ou para [ALL_ESTATES]? 1438 Adicionar à lista de permitidos somente para esta propriedade ou para [ALL_ESTATES]?
1454 <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/> 1439 <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/>
diff --git a/linden/indra/newview/skins/default/xui/ru/notifications.xml b/linden/indra/newview/skins/default/xui/ru/notifications.xml
index 0d36371..e0f7740 100644
--- a/linden/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/ru/notifications.xml
@@ -1452,21 +1452,6 @@ www.secondlife.com/support
1452 <button name="Cancel" text="Отмена"/> 1452 <button name="Cancel" text="Отмена"/>
1453 </form> 1453 </form>
1454 </notification> 1454 </notification>
1455 <notification label="Изменить участок Линденов" name="ChangeLindenEstate">
1456 Вы хотите сменить поместья, принадлежащие Линденам (материк, детский Grid, остров ориентации и т.д.).
1457
1458Это ЧРЕЗВЫЧАЙНО ОПАСНО, потому что это может существенно повлиять на положение вещей. На материке это может изменить тысячи регионов, и испортить работу серверов.
1459
1460Продолжить?
1461 <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
1462 </notification>
1463 <notification label="Изменить доступ к участку Линденов" name="ChangeLindenAccess">
1464 Вы хотите сменить поместья, принадлежащие Линденам (материк, детский Grid, остров ориентации и т.д.).
1465
1466Это ЧРЕЗВЫЧАЙНО ОПАСНО и может использоватся только для того, чтобы вызвать методы, позволяющие перемещать объекты/L$ в/из Grid.
1467Это может изменить тысячи регионов, и испортить работу серверов.
1468 <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
1469 </notification>
1470 <notification label="Выбрать поместье" name="EstateAllowedAgentAdd"> 1455 <notification label="Выбрать поместье" name="EstateAllowedAgentAdd">
1471 Добавить в список разрешенных этого поместья или [ALL_ESTATES]? 1456 Добавить в список разрешенных этого поместья или [ALL_ESTATES]?
1472 <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Все поместья" yestext="Это поместье"/> 1457 <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Все поместья" yestext="Это поместье"/>
diff --git a/linden/indra/newview/skins/default/xui/uk/notifications.xml b/linden/indra/newview/skins/default/xui/uk/notifications.xml
index c7457b3..d207d02 100644
--- a/linden/indra/newview/skins/default/xui/uk/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/uk/notifications.xml
@@ -1436,21 +1436,6 @@ www.secondlife.com/support
1436 <button name="Cancel" text="Відміна"/> 1436 <button name="Cancel" text="Відміна"/>
1437 </form> 1437 </form>
1438 </notification> 1438 </notification>
1439 <notification label="Змінити ділянку Лінденів" name="ChangeLindenEstate">
1440 Ви хочете змінити маєтки, що належать Лінденам (материк, дитячий Grid, остров орієнтації і т.д.).
1441
1442Це НАДЗВИЧАЙНО НЕБЕЗПЕЧНО, тому що це може суттєво вплинути на стан речей. На материку це може змінити тисячі регіонів, і зіпсувати роботу серверів.
1443
1444Продовжити?
1445 <usetemplate name="okcancelbuttons" notext="Відміна" yestext="OK"/>
1446 </notification>
1447 <notification label="Змінити доступ до ділянки Лінденів" name="ChangeLindenAccess">
1448 Ви хочете змінити маєтки, що належать Лінденам (материк, дитячий Grid, остров орієнтації і т.д.).
1449
1450Це НАДЗВИЧАЙНО НЕБЕЗПЕЧНО і може використовуватися тільки для того, щоб викликати методи, що дозволять переміщати об&apos;єкти/L$ в/з Grid.
1451Це може змінити тисячі регіонів, і зіпсувати роботу серверів.
1452 <usetemplate name="okcancelbuttons" notext="Відміна" yestext="OK"/>
1453 </notification>
1454 <notification label="Обрати маєток" name="EstateAllowedAgentAdd"> 1439 <notification label="Обрати маєток" name="EstateAllowedAgentAdd">
1455 Додати в список дозволених цього маєтку або [ALL_ESTATES]? 1440 Додати в список дозволених цього маєтку або [ALL_ESTATES]?
1456 <usetemplate canceltext="Відміна" name="yesnocancelbuttons" notext="Всі маєтки" yestext="Цей маєток"/> 1441 <usetemplate canceltext="Відміна" name="yesnocancelbuttons" notext="Всі маєтки" yestext="Цей маєток"/>
diff --git a/linden/indra/newview/skins/default/xui/zh/notifications.xml b/linden/indra/newview/skins/default/xui/zh/notifications.xml
index acbb18b..415e5e7 100644
--- a/linden/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/zh/notifications.xml
@@ -1538,29 +1538,6 @@ www.secondlife.com/support
1538 <button name="OK" text="确定"/> 1538 <button name="OK" text="确定"/>
1539 </form> 1539 </form>
1540 </notification> 1540 </notification>
1541 <notification label="更改林登地产" name="ChangeLindenEstate">
1542 你将要更改林登所有的地产(大陆、
1543少年网格、方位岛,等等)。
1544
1545 这个动作极度危险,因为它可能会在基础的层次上
1546影响到用户体验。在大陆上, 它将改变
1547上千的区域,并会使空间服务器噎着。
1548
1549是否继续?
1550 <usetemplate name="okcancelbuttons" notext="取消" yestext="更改不动产"/>
1551 </notification>
1552 <notification label="更改林登地产准入列表" name="ChangeLindenAccess">
1553 你将要更改林登所有的地产的准入列表(大陆、
1554少年网格、方位岛,等等)。
1555
1556该操作非常危险, 应该仅在利用把物体/金钱
1557转移进或出某个网格的对付活儿 (hack) 时候
1558才应该被执行。 它将改变上千的区域,并会
1559使空间服务器噎着。
1560
1561是否继续?
1562 <usetemplate name="okcancelbuttons" notext="取消" yestext="更改不动产"/>
1563 </notification>
1564 <notification label="选择地产" name="EstateAllowedAgentAdd"> 1541 <notification label="选择地产" name="EstateAllowedAgentAdd">
1565 仅列入此地产还是[ALL_ESTATES]的允许名单? 1542 仅列入此地产还是[ALL_ESTATES]的允许名单?
1566 <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="所有地产" yestext="该地产"/> 1543 <usetemplate canceltext="取消" name="yesnocancelbuttons" notext="所有地产" yestext="该地产"/>
diff --git a/linden/indra/test/lltemplatemessagebuilder_tut.cpp b/linden/indra/test/lltemplatemessagebuilder_tut.cpp
index 5b33d02..9fecc2f 100644
--- a/linden/indra/test/lltemplatemessagebuilder_tut.cpp
+++ b/linden/indra/test/lltemplatemessagebuilder_tut.cpp
@@ -35,7 +35,6 @@
35#include "linden_common.h" 35#include "linden_common.h"
36#include "lltut.h" 36#include "lltut.h"
37 37
38#include "llapr.h"
39#include "llmessagetemplate.h" 38#include "llmessagetemplate.h"
40#include "llquaternion.h" 39#include "llquaternion.h"
41#include "lltemplatemessagebuilder.h" 40#include "lltemplatemessagebuilder.h"
@@ -59,7 +58,6 @@ namespace tut
59 static bool init = false; 58 static bool init = false;
60 if(! init) 59 if(! init)
61 { 60 {
62 ll_init_apr();
63 const F32 circuit_heartbeat_interval=5; 61 const F32 circuit_heartbeat_interval=5;
64 const F32 circuit_timeout=100; 62 const F32 circuit_timeout=100;
65 63
diff --git a/linden/indra/test/message_tut.cpp b/linden/indra/test/message_tut.cpp
index 3fede26..694db52 100644
--- a/linden/indra/test/message_tut.cpp
+++ b/linden/indra/test/message_tut.cpp
@@ -35,7 +35,6 @@
35#include "linden_common.h" 35#include "linden_common.h"
36#include "lltut.h" 36#include "lltut.h"
37 37
38#include "llapr.h"
39#include "llmessageconfig.h" 38#include "llmessageconfig.h"
40#include "llsdserialize.h" 39#include "llsdserialize.h"
41#include "llversionserver.h" 40#include "llversionserver.h"
@@ -68,7 +67,6 @@ namespace tut
68 static bool init = false; 67 static bool init = false;
69 if(!init) 68 if(!init)
70 { 69 {
71 ll_init_apr();
72 //init_prehash_data(); 70 //init_prehash_data();
73 init = true; 71 init = true;
74 } 72 }
diff --git a/linden/indra/test/test.cpp b/linden/indra/test/test.cpp
index ba81c6e..b699f74 100644
--- a/linden/indra/test/test.cpp
+++ b/linden/indra/test/test.cpp
@@ -43,8 +43,8 @@
43#include "linden_common.h" 43#include "linden_common.h"
44#include "llerrorcontrol.h" 44#include "llerrorcontrol.h"
45#include "lltut.h" 45#include "lltut.h"
46#include "aiaprpool.h"
46 47
47#include "apr_pools.h"
48#include "apr_getopt.h" 48#include "apr_getopt.h"
49 49
50// the CTYPE_WORKAROUND is needed for linux dev stations that don't 50// the CTYPE_WORKAROUND is needed for linux dev stations that don't
@@ -248,17 +248,12 @@ int main(int argc, char **argv)
248 ctype_workaround(); 248 ctype_workaround();
249#endif 249#endif
250 250
251 apr_initialize(); 251 LLAPRPool pool;
252 apr_pool_t* pool = NULL; 252 pool.create();
253 if(APR_SUCCESS != apr_pool_create(&pool, NULL))
254 {
255 std::cerr << "Unable to initialize pool" << std::endl;
256 return 1;
257 }
258 apr_getopt_t* os = NULL; 253 apr_getopt_t* os = NULL;
259 if(APR_SUCCESS != apr_getopt_init(&os, pool, argc, argv)) 254 if(APR_SUCCESS != apr_getopt_init(&os, pool(), argc, argv))
260 { 255 {
261 std::cerr << "Unable to pool" << std::endl; 256 std::cerr << "Unable to initialize the arguments for parsing by apr_getopt()." << std::endl;
262 return 1; 257 return 1;
263 } 258 }
264 259
@@ -360,6 +355,5 @@ int main(int argc, char **argv)
360 s.close(); 355 s.close();
361 } 356 }
362 357
363 apr_terminate();
364 return 0; 358 return 0;
365} 359}
diff --git a/linden/indra/test_apps/llplugintest/demo_plugin.cpp b/linden/indra/test_apps/llplugintest/demo_plugin.cpp
index 772fa16..fd67a58 100644
--- a/linden/indra/test_apps/llplugintest/demo_plugin.cpp
+++ b/linden/indra/test_apps/llplugintest/demo_plugin.cpp
@@ -33,6 +33,8 @@
33#include "linden_common.h" 33#include "linden_common.h"
34 34
35#ifdef WIN32 35#ifdef WIN32
36# define WIN32_LEAN_AND_MEAN
37# include <winsock2.h>
36#include <windows.h> 38#include <windows.h>
37#endif 39#endif
38 40
diff --git a/linden/indra/test_apps/llplugintest/llmediaplugintest.cpp b/linden/indra/test_apps/llplugintest/llmediaplugintest.cpp
index bc3703d..bf0a47b 100644
--- a/linden/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/linden/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -190,9 +190,6 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
190 std::cout << "Unable to read bookmarks from file: " << bookmarks_filename << std::endl; 190 std::cout << "Unable to read bookmarks from file: " << bookmarks_filename << std::endl;
191 }; 191 };
192 192
193 // initialize linden lab APR module
194 ll_init_apr();
195
196 // Set up llerror logging 193 // Set up llerror logging
197 { 194 {
198 LLError::initForApplication("."); 195 LLError::initForApplication(".");
diff --git a/linden/indra/win_crash_logger/StdAfx.h b/linden/indra/win_crash_logger/StdAfx.h
index 021a995..79198c2 100644
--- a/linden/indra/win_crash_logger/StdAfx.h
+++ b/linden/indra/win_crash_logger/StdAfx.h
@@ -46,6 +46,8 @@
46 46
47 47
48// Windows Header Files: 48// Windows Header Files:
49# define WIN32_LEAN_AND_MEAN
50# include <winsock2.h>
49#include <windows.h> 51#include <windows.h>
50 52
51// C RunTime Header Files 53// C RunTime Header Files
diff --git a/linden/indra/win_crash_logger/llcrashloggerwindows.h b/linden/indra/win_crash_logger/llcrashloggerwindows.h
index e6a9c77..f2a877e 100644
--- a/linden/indra/win_crash_logger/llcrashloggerwindows.h
+++ b/linden/indra/win_crash_logger/llcrashloggerwindows.h
@@ -34,6 +34,8 @@
34#define LLCRASHLOGGERWINDOWS_H 34#define LLCRASHLOGGERWINDOWS_H
35 35
36#include "llcrashlogger.h" 36#include "llcrashlogger.h"
37# define WIN32_LEAN_AND_MEAN
38# include <winsock2.h>
37#include "windows.h" 39#include "windows.h"
38#include "llstring.h" 40#include "llstring.h"
39 41
diff --git a/linden/indra/win_updater/updater.cpp b/linden/indra/win_updater/updater.cpp
index 117b8e8..481ef34 100644
--- a/linden/indra/win_updater/updater.cpp
+++ b/linden/indra/win_updater/updater.cpp
@@ -39,6 +39,8 @@
39// *TODO: Switch to fopen_s, strtok_s, etc. 39// *TODO: Switch to fopen_s, strtok_s, etc.
40#define _CRT_SECURE_NO_DEPRECATE 40#define _CRT_SECURE_NO_DEPRECATE
41 41
42# define WIN32_LEAN_AND_MEAN
43# include <winsock2.h>
42#include <windows.h> 44#include <windows.h>
43#include <wininet.h> 45#include <wininet.h>
44#include <stdio.h> 46#include <stdio.h>
diff --git a/linden/install.xml b/linden/install.xml
index ec5090b..31d4c28 100755
--- a/linden/install.xml
+++ b/linden/install.xml
@@ -209,9 +209,9 @@
209 <key>windows</key> 209 <key>windows</key>
210 <map> 210 <map>
211 <key>md5sum</key> 211 <key>md5sum</key>
212 <string>094acc8173faca882ed9532e868d767f</string> 212 <string>ed53511382d0fd9fec59a9f6544d9672</string>
213 <key>url</key> 213 <key>url</key>
214 <uri>http://imprudenceviewer.org/download/libs/boost-1.36.0-windows-20091124.tar.bz2</uri> 214 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20091029.tar.bz2</uri>
215 </map> 215 </map>
216 </map> 216 </map>
217 </map> 217 </map>
@@ -1284,6 +1284,13 @@ Copyright (C) 2004-2005 Vladimir Berezniker @ http://public.xdi.org/=vmpn
1284 <key>url</key> 1284 <key>url</key>
1285 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri> 1285 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri>
1286 </map> 1286 </map>
1287 <key>linux64</key>
1288 <map>
1289 <key>md5sum</key>
1290 <string>30cb00069fe2a545fbf7be1070386236</string>
1291 <key>url</key>
1292 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri>
1293 </map>
1287 </map> 1294 </map>
1288 </map> 1295 </map>
1289 <key>quicktime</key> 1296 <key>quicktime</key>