Skip to content
Snippets Groups Projects
Commit 810a0b3d authored by Josh Bell's avatar Josh Bell
Browse files

svn merge -r 88872:89137 svn+ssh://svn.lindenlab.com/svn/linden/qa/qar-652 --> release

Effectively:
svn merge -r 87048:88773 svn+ssh://svn.lindenlab.com/svn/linden/branches/Branch_1-22-Server
* Plus some gcc4.x fixes

In detail:

* Bump version numbers to 1.22.0 Server
* Updated files for enabled conductor.
* Added tarball pulling during deploy for central servers.
* DEV-15160 Logins not remembering start location on beta grid
* DEV-15167 Random failure with set-classified-stats
* DEV-15193 Viewer Passing Through Unsanitized Strings to DB when creating classifieds.
* Add --location to the curl invocation in fetch_agni_ws_snapshot
* QAR-609 Some Havok4 bug fixes
* QAR-460 Automatic XUI selection & Kick-ass Linux Fonts MergeMe
* DEV-14704 1.21.1.86182 revealing hidden groups in profile
* DEV-14641 Change automated Subject Line messages for IM-to-Email to avoid SPAM association
* DEV-15387 Write unit test for LLStringFn::strip_invalid_xml().
* Changed getpass.getuser() to os.getuid() as getuser() was returning the saved-UID of the process (root user, which kic
ks off parabuild as parabuild u
ser). We want os.getuid() as it correctly returns the parabuild user's uid. / Stupid mistake using os.getuid().. .fixed
by using the pwd module to return the unix username given the userid from os.getuid()
* QAR-623 More single ref attachment awesomeness testing
* Committed temporary fix for running dwell and query-cache on deneb.lindenlab.com, since it's in the DFW colo with the
current asset cluster.
* DEV-15783 Groups not shown in search wont appear in your profile while using webservice
* QAR-642 Even more single ref attachment awesomeness testing

From Branch_1-21-Server (which didn't go directly into release)
* addinng the phputf8 library found from http://phputf8.sourceforge.net/ and liscensed LGPL. For DEV-15202
* Checking in a fix for settle balance portion proc - the event query was moved.
* fix for DEV-15202 - replace non-utf8 with REPLACEMENT CHAR. See jira for more info.
* Checking return value from /proc/vault/charge, must get back a string.
* removed code used for the browser hud AB test.
* Changed TTL from stupid default of 1234 to 5
* DEV-15788  Fixing crashloganalyzer.py cleanup of unparseable crash reports.
* DEV-15737  offline scripted IMs not working inprocess_im_using_ws

Merge conflict resolutions/fixes include:
* Addition of indra/test/llstring_tut.cpp to indra/test/test.vcproj migrated to CMakeLists.txt
* Changes to BuildParams, scripts/automated_build_scripts/* reviewed w/ cg
* Changes to deploy scripts (scripts/farm, install_indra.py, farm_deploy) based on the 1.22 changes except for mkpersist
dir addition (retained from release)
* Changes to scripts/crash_report/crashloganalyzer.py retained from 1.22, per Mani
* scripts/generate_indra_xml.py, etc/services-station.dtd, indra/newsim/llagentinfo.cpp analyzed carefully by josh
* indra/llcommon/llstring.h required fix for client build ("" --> std::basic_string<T>()) in LLStringBase<T> initializer
* indra/llphysics/abstract/llphysicsshape.h #include syntax changed from <llmath/llvolume.h> to "llvolume.h"

Psst, don't tell anyone, but the dataserver-is-deprecated
parent ad332810
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -224,6 +224,7 @@ LLSD LLApp::getOptionData(OptionPriority level)
void LLApp::stepFrame()
{
LLFrameTimer::updateFrameTime();
LLFrameTimer::updateFrameCount();
LLEventTimer::updateClass();
mRunner.run();
}
......
......@@ -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()
......
......@@ -67,10 +67,14 @@ class LLFrameTimer
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();
......
......@@ -68,20 +68,24 @@ class LLKeyThrottleImpl
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 @@ class LLKeyThrottle
// 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 @@ class LLKeyThrottle
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 @@ class LLKeyThrottle
// (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 @@ class LLKeyThrottle
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
......@@ -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;
}
}
......
......@@ -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>
......
......@@ -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";
......
......@@ -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
......@@ -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);
......
......@@ -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 );
}
......
......@@ -3013,6 +3013,7 @@ void LLAppViewer::idle()
static LLTimer idle_timer;
LLFrameTimer::updateFrameTime();
LLFrameTimer::updateFrameCount();
LLEventTimer::updateClass();
LLCriticalDamp::updateInterpolants();
LLMortician::updateClass();
......
......@@ -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);
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment