summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/indra_constants.h12
-rw-r--r--indra/llcommon/llapp.cpp1
-rw-r--r--indra/llcommon/llframetimer.cpp1
-rw-r--r--indra/llcommon/llframetimer.h8
-rw-r--r--indra/llcommon/llkeythrottle.h83
-rw-r--r--indra/llcommon/llstring.cpp26
-rw-r--r--indra/llcommon/llstring.h21
-rw-r--r--indra/llcommon/llversionserver.h6
-rw-r--r--indra/llmessage/llservicebuilder.cpp70
-rw-r--r--indra/llmessage/llservicebuilder.h15
-rw-r--r--indra/llui/llbutton.cpp4
-rw-r--r--indra/newview/llappviewer.cpp1
-rw-r--r--indra/newview/llfloatercamera.cpp1
-rw-r--r--indra/test/CMakeLists.txt1
14 files changed, 150 insertions, 100 deletions
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index a0b1293639..5697fb9f41 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -38,7 +38,11 @@
// At 45 Hz collisions seem stable and objects seem
// to settle down at a reasonable rate.
// JC 3/18/2003
-const F32 PHYSICS_TIMESTEP = 1.f / 45.f;
+
+// const F32 PHYSICS_TIMESTEP = 1.f / 45.f;
+// This must be a #define due to anal retentive restrictions on const expressions
+// CG 2008-06-05
+#define PHYSICS_TIMESTEP (1.f / 45.f)
const F32 COLLISION_TOLERANCE = 0.1f;
const F32 HALF_COLLISION_TOLERANCE = COLLISION_TOLERANCE * 0.5f;
@@ -50,9 +54,9 @@ const U32 DAYS_PER_LINDEN_YEAR = 11;
const U32 SEC_PER_LINDEN_DAY = HOURS_PER_LINDEN_DAY * 60 * 60;
const U32 SEC_PER_LINDEN_YEAR = DAYS_PER_LINDEN_YEAR * SEC_PER_LINDEN_DAY;
-const F32 REGION_WIDTH_METERS = 256.f;
-const S32 REGION_WIDTH_UNITS = 256;
-const U32 REGION_WIDTH_U32 = 256;
+static const F32 REGION_WIDTH_METERS = 256.f;
+static const S32 REGION_WIDTH_UNITS = 256;
+static const U32 REGION_WIDTH_U32 = 256;
const F32 REGION_HEIGHT_METERS = 4096.f;
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 2c7c7e38a4..8826251617 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -224,6 +224,7 @@ LLSD LLApp::getOptionData(OptionPriority level)
void LLApp::stepFrame()
{
LLFrameTimer::updateFrameTime();
+ LLFrameTimer::updateFrameCount();
LLEventTimer::updateClass();
mRunner.run();
}
diff --git a/indra/llcommon/llframetimer.cpp b/indra/llcommon/llframetimer.cpp
index b74151bc2a..a61c5bda81 100644
--- a/indra/llcommon/llframetimer.cpp
+++ b/indra/llcommon/llframetimer.cpp
@@ -53,7 +53,6 @@ void LLFrameTimer::updateFrameTime()
sTotalTime = total_time;
sTotalSeconds = U64_to_F64(sTotalTime) * USEC_TO_SEC_F64;
sFrameTime = U64_to_F64(sTotalTime - sStartTotalTime) * USEC_TO_SEC_F64;
- sFrameCount++;
}
void LLFrameTimer::start()
diff --git a/indra/llcommon/llframetimer.h b/indra/llcommon/llframetimer.h
index 2998560ab9..7ef92f64e4 100644
--- a/indra/llcommon/llframetimer.h
+++ b/indra/llcommon/llframetimer.h
@@ -67,10 +67,14 @@ public:
return sTotalSeconds;
}
- // Call this method once per frame to update the current frame time.
+ // Call this method once per frame to update the current frame time. This is actually called
+ // at some other times as well
static void updateFrameTime();
- static S32 getFrameCount() { return sFrameCount; }
+ // Call this method once, and only once, per frame to update the current frame count.
+ static void updateFrameCount() { sFrameCount++; }
+
+ static U32 getFrameCount() { return sFrameCount; }
static F32 getFrameDeltaTimeF32();
diff --git a/indra/llcommon/llkeythrottle.h b/indra/llcommon/llkeythrottle.h
index d831eadd59..61a43b2dad 100644
--- a/indra/llcommon/llkeythrottle.h
+++ b/indra/llcommon/llkeythrottle.h
@@ -68,20 +68,24 @@ protected:
U32 countLimit;
// maximum number of keys allowed per interval
- U64 interval_usec;
- // each map covers this time period
- U64 start_usec;
+ U64 intervalLength; // each map covers this time period (usec or frame number)
+ U64 startTime; // start of the time period (usec or frame number)
+
// currMap started counting at this time
// prevMap covers the previous interval
LLKeyThrottleImpl() : prevMap(0), currMap(0),
- countLimit(0), interval_usec(0),
- start_usec(0) { };
+ countLimit(0), intervalLength(1),
+ startTime(0) { };
static U64 getTime()
{
return LLFrameTimer::getTotalTime();
}
+ static U64 getFrame() // Return the current frame number
+ {
+ return (U64) LLFrameTimer::getFrameCount();
+ }
};
@@ -89,17 +93,10 @@ template< class T >
class LLKeyThrottle
{
public:
- LLKeyThrottle(U32 limit, F32 interval)
+ LLKeyThrottle(U32 limit, F32 interval, BOOL realtime = TRUE) // realtime = FALSE for frame-based throttle, TRUE for usec real-time throttle
: m(* new LLKeyThrottleImpl<T>)
{
- // limit is the maximum number of keys
- // allowed per interval (in seconds)
- m.countLimit = limit;
- m.interval_usec = (U64)(interval * USEC_PER_SEC);
- m.start_usec = LLKeyThrottleImpl<T>::getTime();
-
- m.prevMap = new typename LLKeyThrottleImpl<T>::EntryMap;
- m.currMap = new typename LLKeyThrottleImpl<T>::EntryMap;
+ setParameters( limit, interval, realtime );
}
~LLKeyThrottle()
@@ -118,18 +115,26 @@ public:
// call each time the key wants use
State noteAction(const T& id, S32 weight = 1)
{
- U64 now = LLKeyThrottleImpl<T>::getTime();
+ U64 now = 0;
+ if ( mIsRealtime )
+ {
+ now = LLKeyThrottleImpl<T>::getTime();
+ }
+ else
+ {
+ now = LLKeyThrottleImpl<T>::getFrame();
+ }
- if (now >= (m.start_usec + m.interval_usec))
+ if (now >= (m.startTime + m.intervalLength))
{
- if (now < (m.start_usec + 2 * m.interval_usec))
+ if (now < (m.startTime + 2 * m.intervalLength))
{
// prune old data
delete m.prevMap;
m.prevMap = m.currMap;
m.currMap = new typename LLKeyThrottleImpl<T>::EntryMap;
- m.start_usec += m.interval_usec;
+ m.startTime += m.intervalLength;
}
else
{
@@ -139,7 +144,7 @@ public:
m.prevMap = new typename LLKeyThrottleImpl<T>::EntryMap;
m.currMap = new typename LLKeyThrottleImpl<T>::EntryMap;
- m.start_usec = now;
+ m.startTime = now;
}
}
@@ -166,7 +171,7 @@ public:
// (now) time.
// compute current, windowed rate
- F64 timeInCurrent = ((F64)(now - m.start_usec) / m.interval_usec);
+ F64 timeInCurrent = ((F64)(now - m.startTime) / m.intervalLength);
F64 averageCount = curr.count + prevCount * (1.0 - timeInCurrent);
curr.blocked |= averageCount > m.countLimit;
@@ -224,8 +229,46 @@ public:
return FALSE;
}
+ // Get the throttling parameters
+ void getParameters( U32 & out_limit, F32 & out_interval, BOOL & out_realtime )
+ {
+ out_limit = m.countLimit;
+ out_interval = m.intervalLength;
+ out_realtime = mIsRealtime;
+ }
+
+ // Set the throttling behavior
+ void setParameters( U32 limit, F32 interval, BOOL realtime )
+ {
+ // limit is the maximum number of keys
+ // allowed per interval (in seconds or frames)
+ mIsRealtime = realtime;
+ m.countLimit = limit;
+ if ( mIsRealtime )
+ {
+ m.intervalLength = (U64)(interval * USEC_PER_SEC);
+ m.startTime = LLKeyThrottleImpl<T>::getTime();
+ }
+ else
+ {
+ m.intervalLength = (U64)interval;
+ m.startTime = LLKeyThrottleImpl<T>::getFrame();
+ }
+
+ if ( m.intervalLength == 0 )
+ { // Don't allow zero intervals
+ m.intervalLength = 1;
+ }
+
+ delete m.prevMap;
+ m.prevMap = new typename LLKeyThrottleImpl<T>::EntryMap;
+ delete m.currMap;
+ m.currMap = new typename LLKeyThrottleImpl<T>::EntryMap;
+ }
+
protected:
LLKeyThrottleImpl<T>& m;
+ BOOL mIsRealtime; // TRUE to be time based (default), FALSE for frame based
};
#endif
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 7a2d42dfaa..3a8756a31f 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -929,6 +929,32 @@ namespace LLStringFn
}
}
}
+
+ // https://wiki.lindenlab.com/wiki/Unicode_Guidelines has details on
+ // allowable code points for XML. Specifically, they are:
+ // 0x09, 0x0a, 0x0d, and 0x20 on up. JC
+ std::string strip_invalid_xml(const std::string& input)
+ {
+ std::string output;
+ output.reserve( input.size() );
+ std::string::const_iterator it = input.begin();
+ while (it != input.end())
+ {
+ // Must compare as unsigned for >=
+ // Test most likely match first
+ const unsigned char c = (unsigned char)*it;
+ if ( c >= (unsigned char)0x20 // SPACE
+ || c == (unsigned char)0x09 // TAB
+ || c == (unsigned char)0x0a // LINE_FEED
+ || c == (unsigned char)0x0d ) // CARRIAGE_RETURN
+ {
+ output.push_back(c);
+ }
+ ++it;
+ }
+ return output;
+ }
+
}
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 8a1e1fe8cb..18cfe4b64c 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -545,6 +545,13 @@ namespace LLStringFn
*/
void replace_nonprintable_and_pipe(std::basic_string<llwchar>& str,
llwchar replacement);
+
+ /**
+ * @brief Remove all characters that are not allowed in XML 1.0.
+ * Returns a copy of the string with those characters removed.
+ * Works with US ASCII and UTF-8 encoded strings. JC
+ */
+ std::string strip_invalid_xml(const std::string& input);
}
////////////////////////////////////////////////////////////
@@ -739,17 +746,9 @@ LLStringBase<T>::LLStringBase(const T* s, size_type n ) : std::basic_string<T>()
// Init from a substring
template<class T>
-LLStringBase<T>::LLStringBase(const T* s, size_type pos, size_type n ) : std::basic_string<T>()
-{
- if( s )
- {
- assign(s + pos, n);
- }
- else
- {
- assign(LLStringBase<T>::null);
- }
-}
+LLStringBase<T>::LLStringBase(const T* s, size_type pos, size_type n )
+: std::basic_string<T>( (s ? s : std::basic_string<T>() ), pos, n )
+{ }
//static
template<class T>
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 291f6d6347..97472ea208 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -33,9 +33,9 @@
#define LL_LLVERSIONSERVER_H
const S32 LL_VERSION_MAJOR = 1;
-const S32 LL_VERSION_MINOR = 21;
-const S32 LL_VERSION_PATCH = 1;
-const S32 LL_VERSION_BUILD = 86526;
+const S32 LL_VERSION_MINOR = 22;
+const S32 LL_VERSION_PATCH = 2;
+const S32 LL_VERSION_BUILD = 87048;
const char * const LL_CHANNEL = "Second Life Server";
diff --git a/indra/llmessage/llservicebuilder.cpp b/indra/llmessage/llservicebuilder.cpp
index d5c6014140..6442767ebd 100644
--- a/indra/llmessage/llservicebuilder.cpp
+++ b/indra/llmessage/llservicebuilder.cpp
@@ -111,10 +111,13 @@ std::string LLServiceBuilder::buildServiceURI(
const std::string& service_name,
const LLSD& option_map)
{
- std::string service_url = buildServiceURI(service_name);
-
- // Find the Service Name
- if(!service_url.empty() && option_map.isMap())
+ return russ_format(buildServiceURI(service_name), option_map);
+}
+
+std::string russ_format(const std::string& format_str, const LLSD& context)
+{
+ std::string service_url(format_str);
+ if(!service_url.empty() && context.isMap())
{
// throw in a ridiculously large limiter to make sure we don't
// loop forever with bad input.
@@ -134,9 +137,9 @@ std::string LLServiceBuilder::buildServiceURI(
std::string::iterator end(service_url.end());
std::string::iterator deepest_node(service_url.end());
std::string::iterator deepest_node_end(service_url.end());
- //parse out the variables to replace by going through {}s one at a time,
- // starting with the "deepest" in series {{}},
- // and otherwise replacing right-to-left
+ // parse out the variables to replace by going through {}s
+ // one at a time, starting with the "deepest" in series
+ // {{}}, and otherwise replacing right-to-left
for(; iter != end; ++iter)
{
switch(*iter)
@@ -171,7 +174,7 @@ std::string LLServiceBuilder::buildServiceURI(
// params and straight string substitution, so it's a
// known distance of 2 to skip the directive.
std::string key(deepest_node + 2, deepest_node_end);
- LLSD value = option_map[key];
+ LLSD value = context[key];
switch(*(deepest_node + 1))
{
case '$':
@@ -184,7 +187,9 @@ std::string LLServiceBuilder::buildServiceURI(
}
else
{
- llwarns << "Unknown key: " << key << " in option map: " << LLSDOStreamer<LLSDNotationFormatter>(option_map) << llendl;
+ llwarns << "Unknown key: " << key << " in option map: "
+ << LLSDOStreamer<LLSDNotationFormatter>(context)
+ << llendl;
keep_looping = false;
}
break;
@@ -212,50 +217,3 @@ std::string LLServiceBuilder::buildServiceURI(
}
return service_url;
}
-
-
-
-// Old, not as good implementation. Phoenix 2007-10-15
-#if 0
- // Do brace replacements - NOT CURRENTLY RECURSIVE
- for(LLSD::map_const_iterator option_itr = option_map.beginMap();
- option_itr != option_map.endMap();
- ++option_itr)
- {
- std::string variable_name = "{$";
- variable_name.append((*option_itr).first);
- variable_name.append("}");
- std::string::size_type find_pos = service_url.find(variable_name);
- if(find_pos != std::string::npos)
- {
- service_url.replace(
- find_pos,
- variable_name.length(),
- (*option_itr).second.asString());
- continue;
- }
- variable_name.assign("{%");
- variable_name.append((*option_itr).first);
- variable_name.append("}");
- find_pos = service_url.find(variable_name);
- if(find_pos != std::string::npos)
- {
- std::string query_str = LLURI::mapToQueryString(
- (*option_itr).second);
- service_url.replace(
- find_pos,
- variable_name.length(),
- query_str);
- }
- }
- }
-
- if (service_url.find('{') != std::string::npos)
- {
- llwarns << "Constructed a likely bogus service URL: " << service_url
- << llendl;
- }
-
- return service_url;
-}
-#endif
diff --git a/indra/llmessage/llservicebuilder.h b/indra/llmessage/llservicebuilder.h
index 2c00660893..30e44923b6 100644
--- a/indra/llmessage/llservicebuilder.h
+++ b/indra/llmessage/llservicebuilder.h
@@ -38,11 +38,24 @@
class LLSD;
+/**
+ * @brief Format format string according to rules for RUSS.
+ *
+ * This function appears alongside the service builder since the
+ * algorithm was originally implemented there. This can eventually be
+ * moved when someone wants to take the time.
+ * @see https://osiris.lindenlab.com/mediawiki/index.php/Recursive_URL_Substitution_Syntax
+ * @param format_str The input string to format.
+ * @param context A map used for string substitutions.
+ * @return Returns the formatted string. If no match is found for a
+ * substitution target, the braces remain intact.
+ */
+std::string russ_format(const std::string& format_str, const LLSD& context);
+
/**
* @class LLServiceBuilder
* @brief This class builds urls for us to use when making web service calls.
*/
-
class LLServiceBuilder
{
LOG_CLASS(LLServiceBuilder);
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index b8cf8f7984..7d54aeb950 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -321,7 +321,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)
}
mMouseDownTimer.start();
- mMouseDownFrame = LLFrameTimer::getFrameCount();
+ mMouseDownFrame = (S32) LLFrameTimer::getFrameCount();
if (getSoundFlags() & MOUSE_DOWN)
{
@@ -385,7 +385,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
if (mMouseDownTimer.getStarted() && NULL != mHeldDownCallback)
{
F32 elapsed = getHeldDownTime();
- if( mHeldDownDelay <= elapsed && mHeldDownFrameDelay <= LLFrameTimer::getFrameCount() - mMouseDownFrame)
+ if( mHeldDownDelay <= elapsed && mHeldDownFrameDelay <= (S32)LLFrameTimer::getFrameCount() - mMouseDownFrame)
{
mHeldDownCallback( mCallbackUserData );
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 2b5691ffe8..8140f00167 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3013,6 +3013,7 @@ void LLAppViewer::idle()
static LLTimer idle_timer;
LLFrameTimer::updateFrameTime();
+ LLFrameTimer::updateFrameCount();
LLEventTimer::updateClass();
LLCriticalDamp::updateInterpolants();
LLMortician::updateClass();
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 24b82c370a..75e1d694a4 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -52,6 +52,7 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
{
setIsChrome(TRUE);
+ // For now, only used for size and tooltip strings
const BOOL DONT_OPEN = FALSE;
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_camera.xml", NULL, DONT_OPEN);
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 32579e4fe2..63e5538388 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -55,6 +55,7 @@ set(test_SOURCE_FILES
llsdutil_tut.cpp
llservicebuilder_tut.cpp
llstreamtools_tut.cpp
+ llstring_tut.cpp
lltemplatemessagebuilder_tut.cpp
lltiming_tut.cpp
lltut.cpp