summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/lib/python/indra/base/llsd.py11
-rw-r--r--indra/llcommon/indra_constants.h13
-rw-r--r--indra/llcommon/llapp.cpp26
-rw-r--r--indra/llcommon/llapp.h8
-rw-r--r--indra/llcommon/llversionserver.h4
-rw-r--r--indra/llmessage/llcircuit.cpp33
-rw-r--r--indra/llmessage/llcircuit.h16
-rw-r--r--indra/llmessage/llregionflags.h8
-rw-r--r--indra/llmessage/message.cpp12
-rw-r--r--indra/llmessage/message.h9
-rw-r--r--indra/lscript/lscript_compile/indra.l27
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.cpp4
-rw-r--r--indra/lscript/lscript_execute/lscript_execute.cpp9
-rw-r--r--indra/newview/llinventorybridge.cpp47
-rw-r--r--indra/newview/llinventorybridge.h3
-rw-r--r--indra/newview/llstartup.cpp14
-rw-r--r--indra/test/lltemplatemessagebuilder_tut.cpp7
-rw-r--r--indra/test/message_tut.cpp8
18 files changed, 202 insertions, 57 deletions
diff --git a/indra/lib/python/indra/base/llsd.py b/indra/lib/python/indra/base/llsd.py
index 057d4e31dc..e6141b6265 100644
--- a/indra/lib/python/indra/base/llsd.py
+++ b/indra/lib/python/indra/base/llsd.py
@@ -36,10 +36,13 @@ import re
from indra.util.fastest_elementtree import ElementTreeError, fromstring
from indra.base import lluuid
-try:
- import cllsd
-except ImportError:
- cllsd = None
+# cllsd.c in server/server-1.25 has memory leaks,
+# so disabling cllsd for now
+#try:
+# import cllsd
+#except ImportError:
+# cllsd = None
+cllsd = None
int_regex = re.compile(r"[-+]?\d+")
real_regex = re.compile(r"[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?")
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index a3e3aec360..c13113a9f2 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
- * Copyright (c) 2001-2007, Linden Research, Inc.
+ * Copyright (c) 2001-2008, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -77,6 +77,14 @@ enum LAND_STAT_REPORT_TYPE
const U32 STAT_FILTER_MASK = 0x1FFFFFFF;
+// Region absolute limits
+static const S32 REGION_AGENT_COUNT_MIN = 1;
+static const S32 REGION_AGENT_COUNT_MAX = 200; // Must fit in U8 for the moment (RegionInfo msg)
+static const S32 REGION_PRIM_COUNT_MIN = 0;
+static const S32 REGION_PRIM_COUNT_MAX = 40000;
+static const F32 REGION_PRIM_BONUS_MIN = 1.0;
+static const F32 REGION_PRIM_BONUS_MAX = 10.0;
+
// Default maximum number of tasks/prims per region.
const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
@@ -229,10 +237,11 @@ const S32 KEY_COUNT = 256;
const F32 DEFAULT_WATER_HEIGHT = 20.0f;
// Maturity ratings for simulators
-const U8 SIM_ACCESS_MIN = 0;
+const U8 SIM_ACCESS_MIN = 0; // Treated as 'unknown', usually ends up being SIM_ACCESS_PG
const U8 SIM_ACCESS_TRIAL = 7;
const U8 SIM_ACCESS_PG = 13;
const U8 SIM_ACCESS_MATURE = 21;
+const U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only
const U8 SIM_ACCESS_DOWN = 254;
const U8 SIM_ACCESS_MAX = SIM_ACCESS_MATURE;
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 8826251617..c2f93b51ac 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -89,6 +89,12 @@ LLAppChildCallback LLApp::sDefaultChildCallback = NULL;
LLApp::LLApp() : mThreadErrorp(NULL)
{
+ commonCtor();
+ startErrorThread();
+}
+
+void LLApp::commonCtor()
+{
// Set our status to running
setStatus(APP_STATUS_RUNNING);
@@ -96,9 +102,9 @@ LLApp::LLApp() : mThreadErrorp(NULL)
#if !LL_WINDOWS
// This must be initialized before the error handler.
- sSigChildCount = new LLAtomicU32(0);
+ sSigChildCount = new LLAtomicU32(0);
#endif
-
+
// Setup error handling
setupErrorHandling();
@@ -118,6 +124,13 @@ LLApp::LLApp() : mThreadErrorp(NULL)
// Set the application to this instance.
sApplication = this;
+
+}
+
+LLApp::LLApp(LLErrorThread *error_thread) :
+ mThreadErrorp(error_thread)
+{
+ commonCtor();
}
@@ -261,17 +274,20 @@ void LLApp::setupErrorHandling()
#endif
+}
+
+void LLApp::startErrorThread()
+{
//
// Start the error handling thread, which is responsible for taking action
// when the app goes into the APP_STATUS_ERROR state
//
- llinfos << "LLApp::setupErrorHandling - Starting error thread" << llendl;
+ llinfos << "Starting error thread" << llendl;
mThreadErrorp = new LLErrorThread();
mThreadErrorp->setUserData((void *) this);
- mThreadErrorp->start();
+ mThreadErrorp->start();
}
-
void LLApp::setErrorHandler(LLAppErrorHandler handler)
{
LLApp::sErrorHandler = handler;
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index c5a1546883..4142f8ece2 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -77,6 +77,11 @@ public:
LLApp();
virtual ~LLApp();
+protected:
+ LLApp(LLErrorThread* error_thread);
+ void commonCtor();
+public:
+
/**
* @brief Return the static app instance if one was created.
*/
@@ -245,8 +250,9 @@ protected:
void stepFrame();
private:
+ void startErrorThread();
+
void setupErrorHandling(); // Do platform-specific error-handling setup (signals, structured exceptions)
-
static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread.
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index aa3d580dc1..2b5c48fd15 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 = 25;
+const S32 LL_VERSION_MINOR = 26;
const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 104413;
+const S32 LL_VERSION_BUILD = 103578;
const char * const LL_CHANNEL = "Second Life Server";
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index 9ad84d8242..cc05e9bf47 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -62,7 +62,6 @@
#include "lltransfermanager.h"
#include "llmodularmath.h"
-const F32 PING_INTERVAL = 5.f; // seconds
const S32 PING_START_BLOCK = 3; // How many pings behind we have to be to consider ourself blocked.
const S32 PING_RELEASE_BLOCK = 2; // How many pings behind we have to be to consider ourself unblocked.
@@ -70,7 +69,8 @@ const F32 TARGET_PERIOD_LENGTH = 5.f; // seconds
const F32 LL_DUPLICATE_SUPPRESSION_TIMEOUT = 60.f; //seconds - this can be long, as time-based cleanup is
// only done when wrapping packetids, now...
-LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id)
+LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id,
+ const F32 circuit_heartbeat_interval, const F32 circuit_timeout)
: mHost (host),
mWrapID(0),
mPacketsOutID(0),
@@ -105,7 +105,9 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id)
mPeakBPSOut(0),
mPeriodTime(0.0),
mExistenceTimer(),
- mCurrentResendCount(0)
+ mCurrentResendCount(0),
+ mHeartbeatInterval(circuit_heartbeat_interval),
+ mHeartbeatTimeout(circuit_timeout)
{
// Need to guarantee that this time is up to date, we may be creating a circuit even though we haven't been
// running a message system loop.
@@ -113,9 +115,9 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id)
F32 distribution_offset = ll_frand();
mPingTime = mt_sec;
- mLastPingSendTime = mt_sec + PING_INTERVAL * distribution_offset;
+ mLastPingSendTime = mt_sec + mHeartbeatInterval * distribution_offset;
mLastPingReceivedTime = mt_sec;
- mNextPingSendTime = mLastPingSendTime + 0.95*PING_INTERVAL + ll_frand(0.1f*PING_INTERVAL);
+ mNextPingSendTime = mLastPingSendTime + 0.95*mHeartbeatInterval + ll_frand(0.1f*mHeartbeatInterval);
mPeriodTime = mt_sec;
mTimeoutCallback = NULL;
@@ -429,7 +431,8 @@ S32 LLCircuitData::resendUnackedPackets(const F64 now)
}
-LLCircuit::LLCircuit() : mLastCircuit(NULL)
+LLCircuit::LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout) : mLastCircuit(NULL),
+ mHeartbeatInterval(circuit_heartbeat_interval), mHeartbeatTimeout(circuit_timeout)
{
}
@@ -447,7 +450,7 @@ LLCircuitData *LLCircuit::addCircuitData(const LLHost &host, TPACKETID in_id)
{
// This should really validate if one already exists
llinfos << "LLCircuit::addCircuitData for " << host << llendl;
- LLCircuitData *tempp = new LLCircuitData(host, in_id);
+ LLCircuitData *tempp = new LLCircuitData(host, in_id, mHeartbeatInterval, mHeartbeatTimeout);
mCircuitData.insert(circuit_data_map::value_type(host, tempp));
mPingSet.insert(tempp);
@@ -801,7 +804,7 @@ void LLCircuit::updateWatchDogTimers(LLMessageSystem *msgsys)
// Always remember to remove it from the set before changing the sorting
// key (mNextPingSendTime)
mPingSet.erase(psit);
- cdp->mNextPingSendTime = cur_time + PING_INTERVAL;
+ cdp->mNextPingSendTime = cur_time + mHeartbeatInterval;
mPingSet.insert(cdp);
continue;
}
@@ -819,7 +822,7 @@ void LLCircuit::updateWatchDogTimers(LLMessageSystem *msgsys)
if (cdp->updateWatchDogTimers(msgsys))
{
// Randomize our pings a bit by doing some up to 5% early or late
- F64 dt = 0.95f*PING_INTERVAL + ll_frand(0.1f*PING_INTERVAL);
+ F64 dt = 0.95f*mHeartbeatInterval + ll_frand(0.1f*mHeartbeatInterval);
// Remove it, and reinsert it with the new next ping time.
// Always remove before changing the sorting key.
@@ -1047,7 +1050,7 @@ BOOL LLCircuitData::checkCircuitTimeout()
F64 time_since_last_ping = LLMessageSystem::getMessageTimeSeconds() - mLastPingReceivedTime;
// Nota Bene: This needs to be turned off if you are debugging multiple simulators
- if (time_since_last_ping > PING_INTERVAL_MAX)
+ if (time_since_last_ping > mHeartbeatTimeout)
{
llwarns << "LLCircuitData::checkCircuitTimeout for " << mHost << " last ping " << time_since_last_ping << " seconds ago." <<llendl;
setAlive(FALSE);
@@ -1063,10 +1066,7 @@ BOOL LLCircuitData::checkCircuitTimeout()
return FALSE;
}
}
- else if (time_since_last_ping > PING_INTERVAL_ALARM)
- {
- //llwarns << "Unresponsive circuit: " << mHost << ": " << time_since_last_ping << " seconds since last ping."<< llendl;
- }
+
return TRUE;
}
@@ -1280,7 +1280,7 @@ void LLCircuitData::pingTimerStop(const U8 ping_id)
delta_ping += 256;
}
- U32 msec = (U32) ((delta_ping*PING_INTERVAL + time) * 1000.f);
+ U32 msec = (U32) ((delta_ping*mHeartbeatInterval + time) * 1000.f);
setPingDelay(msec);
mPingsInTransit = delta_ping;
@@ -1371,7 +1371,8 @@ F32 LLCircuitData::getPingInTransitTime()
if (mPingsInTransit)
{
- time_since_ping_was_sent = (F32)((mPingsInTransit*PING_INTERVAL - 1) + (LLMessageSystem::getMessageTimeSeconds() - mPingTime))*1000.f;
+ time_since_ping_was_sent = (F32)((mPingsInTransit*mHeartbeatInterval - 1)
+ + (LLMessageSystem::getMessageTimeSeconds() - mPingTime))*1000.f;
}
return time_since_ping_was_sent;
diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h
index 492313da93..99da6e7aaf 100644
--- a/indra/llmessage/llcircuit.h
+++ b/indra/llmessage/llcircuit.h
@@ -50,10 +50,6 @@
//
// Constants
//
-const F32 PING_INTERVAL_MAX = 100.f;
-const F32 PING_INTERVAL_ALARM = 50.f;
-
-
const F32 LL_AVERAGED_PING_ALPHA = 0.2f; // relaxation constant on ping running average
const F32 LL_AVERAGED_PING_MAX = 2000; // msec
const F32 LL_AVERAGED_PING_MIN = 100; // msec // IW: increased to avoid retransmits when a process is slow
@@ -85,7 +81,8 @@ class LLSD;
class LLCircuitData
{
public:
- LLCircuitData(const LLHost &host, TPACKETID in_id);
+ LLCircuitData(const LLHost &host, TPACKETID in_id,
+ const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
~LLCircuitData();
S32 resendUnackedPackets(const F64 now);
@@ -283,6 +280,9 @@ protected:
S32 mCurrentResendCount; // Number of resent packets since last spam
LLStatRate mOutOfOrderRate; // Rate of out of order packets coming in.
U32 mLastPacketGap; // Gap in sequence number of last packet.
+
+ const F32 mHeartbeatInterval;
+ const F32 mHeartbeatTimeout;
};
@@ -292,7 +292,7 @@ class LLCircuit
{
public:
// CREATORS
- LLCircuit();
+ LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
~LLCircuit();
// ACCESSORS
@@ -345,5 +345,9 @@ protected:
// optimize the many, many times we call findCircuit. This may be
// set in otherwise const methods, so it is declared mutable.
mutable LLCircuitData* mLastCircuit;
+
+private:
+ const F32 mHeartbeatInterval;
+ const F32 mHeartbeatTimeout;
};
#endif
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 972a184a62..53a1e4ea1a 100644
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
- * Copyright (c) 2002-2007, Linden Research, Inc.
+ * Copyright (c) 2002-2008, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -60,8 +60,10 @@ const U32 REGION_FLAGS_BLOCK_LAND_RESELL = (1 << 7);
// All content wiped once per night
const U32 REGION_FLAGS_SANDBOX = (1 << 8);
const U32 REGION_FLAGS_NULL_LAYER = (1 << 9);
-const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10);
-const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11);
+// const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10);
+const U32 REGION_FLAGS_HARD_ALLOW_LAND_TRANSFER = (1 << 10); // Region allows land reselling
+// const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11);
+const U32 REGION_FLAGS_HARD_ALLOW_POST_CLASSIFIED = (1 << 11); // Region allows posting of classified ads
const U32 REGION_FLAGS_SKIP_COLLISIONS = (1 << 12); // Pin all non agent rigid bodies
const U32 REGION_FLAGS_SKIP_SCRIPTS = (1 << 13);
const U32 REGION_FLAGS_SKIP_PHYSICS = (1 << 14); // Skip all physics
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 0e2a5cbf7f..7c304bd00b 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -290,7 +290,9 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port,
S32 version_major,
S32 version_minor,
S32 version_patch,
- bool failure_is_fatal)
+ bool failure_is_fatal,
+ const F32 circuit_heartbeat_interval, const F32 circuit_timeout) :
+ mCircuitInfo(circuit_heartbeat_interval, circuit_timeout)
{
init();
@@ -2496,7 +2498,9 @@ bool start_messaging_system(
bool b_dump_prehash_file,
const std::string& secret,
const LLUseCircuitCodeResponder* responder,
- bool failure_is_fatal)
+ bool failure_is_fatal,
+ const F32 circuit_heartbeat_interval,
+ const F32 circuit_timeout)
{
gMessageSystem = new LLMessageSystem(
template_name,
@@ -2504,7 +2508,9 @@ bool start_messaging_system(
version_major,
version_minor,
version_patch,
- failure_is_fatal);
+ failure_is_fatal,
+ circuit_heartbeat_interval,
+ circuit_timeout);
g_shared_secret.assign(secret);
if (!gMessageSystem)
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index 46fa3251de..2f10b149c6 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -285,7 +285,8 @@ public:
// Read file and build message templates
LLMessageSystem(const std::string& filename, U32 port, S32 version_major,
S32 version_minor, S32 version_patch,
- bool failure_is_fatal = true);
+ bool failure_is_fatal,
+ const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
~LLMessageSystem();
@@ -780,8 +781,10 @@ bool start_messaging_system(
S32 version_patch,
bool b_dump_prehash_file,
const std::string& secret,
- const LLUseCircuitCodeResponder* responder = NULL,
- bool failure_is_fatal = true);
+ const LLUseCircuitCodeResponder* responder,
+ bool failure_is_fatal,
+ const F32 circuit_heartbeat_interval,
+ const F32 circuit_timeout);
void end_messaging_system();
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 3e62195dc8..2616b47c73 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -36,7 +36,8 @@ FS (f|F)
#include "llclickaction.h"
void count();
-void comment();
+void line_comment();
+void block_comment();
void parse_string();
#define YYLMAX 16384
@@ -60,7 +61,8 @@ extern "C" { int yyerror(const char *fmt, ...); }
%}
%%
-"//" { gInternalLine++; gInternalColumn = 0; comment(); }
+"//" { gInternalLine++; gInternalColumn = 0; line_comment(); }
+"/*" { block_comment(); }
"integer" { count(); return(INTEGER); }
"float" { count(); return(FLOAT_TYPE); }
@@ -790,7 +792,7 @@ S32 yywrap()
return(1);
}
-void comment()
+void line_comment()
{
char c;
@@ -798,6 +800,25 @@ void comment()
;
}
+void block_comment()
+{
+ char c1 = 0;
+ char c2 = yyinput();
+ while (c2 != 0 && c2 != EOF && !(c1 == '*' && c2 == '/')) {
+ if (c2 == '\n')
+ {
+ gInternalLine++;
+ gInternalColumn = 0;
+ }
+ else if (c2 == '\t')
+ gInternalColumn += 4 - (gInternalColumn % 8);
+ else
+ gInternalColumn++;
+ c1 = c2;
+ c2 = yyinput();
+ }
+}
+
void count()
{
S32 i;
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 66f8825845..cd2dc87c5e 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -630,7 +630,9 @@ static void print_cil_cast(LLFILE* fp, LSCRIPTType srcType, LSCRIPTType targetTy
switch(targetType)
{
case LST_INTEGER:
- fprintf(fp, "conv.i4\n");
+ //fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::ToInteger(float32)\n");
+ fprintf(fp, "conv.i4\n"); // TODO replace this line with the above
+ // we the entire grid is > 1.25.1
break;
case LST_STRING:
fprintf(fp, "call string [LslLibrary]LindenLab.SecondLife.LslRunTime::ToString(float32)\n");
diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp
index 52e3af320c..6280719748 100644
--- a/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -891,14 +891,13 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
b_done = TRUE;
}
- while (!b_done)
+ if (!b_done)
{
// Call handler for next queued event.
if(getEventCount() > 0)
{
++events_processed;
callNextQueuedEventHandler(event_register, id, quanta);
- b_done = TRUE;
}
else
{
@@ -910,8 +909,8 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
++events_processed;
callEventHandler(event, id, quanta);
}
- b_done = TRUE;
}
+ b_done = TRUE;
}
}
}
@@ -946,6 +945,10 @@ F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **erro
timer_checks = 0;
}
}
+ if (inloop == 0.0f)
+ {
+ inloop = timer.getElapsedTimeF32();
+ }
return inloop;
}
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d3671239bb..a4b80ed7c1 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -755,6 +755,10 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
model->deleteObject(mUUID);
model->notifyObservers();
}
+ else if ("restoreToWorld" == action)
+ {
+ restoreToWorld();
+ }
else if ("restore" == action)
{
restoreItem();
@@ -811,6 +815,47 @@ void LLItemBridge::restoreItem()
}
}
+void LLItemBridge::restoreToWorld()
+{
+ LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
+ if (itemp)
+ {
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("RezRestoreToWorld");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ itemp->packMessage(msg);
+ msg->sendReliable(gAgent.getRegion()->getHost());
+ }
+
+ //Similar functionality to the drag and drop rez logic
+ BOOL remove_from_inventory = FALSE;
+
+ //remove local inventory copy, sim will deal with permissions and removing the item
+ //from the actual inventory if its a no-copy etc
+ if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ remove_from_inventory = TRUE;
+ }
+
+ // Check if it's in the trash. (again similar to the normal rez logic)
+ LLUUID trash_id;
+ trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
+ {
+ remove_from_inventory = TRUE;
+ }
+
+ if(remove_from_inventory)
+ {
+ gInventory.deleteObject(itemp->getUUID());
+ gInventory.notifyObservers();
+ }
+}
+
LLUIImagePtr LLItemBridge::getIcon() const
{
return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]);
@@ -3375,6 +3420,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Object Wear"));
items.push_back(std::string("Attach To"));
items.push_back(std::string("Attach To HUD"));
+ items.push_back(std::string("Restore to Last Position"));
LLMenuGL* attach_menu = menu.getChildMenuByName("Attach To", TRUE);
LLMenuGL* attach_hud_menu = menu.getChildMenuByName("Attach To HUD", TRUE);
@@ -4363,7 +4409,6 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Wearable Wear"));
items.push_back(std::string("Wearable Edit"));
-
if ((flags & FIRST_SELECTED_ITEM) == 0)
{
disabled_items.push_back(std::string("Wearable Edit"));
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index d038c10c73..5df3ba23af 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -159,6 +159,7 @@ public:
virtual const std::string& getPrefix() { return LLStringUtil::null; }
virtual void restoreItem() {}
+ virtual void restoreToWorld() {}
// LLFolderViewEventListener functions
virtual const std::string& getName() const;
@@ -234,6 +235,7 @@ public:
virtual void selectItem();
virtual void restoreItem();
+ virtual void restoreToWorld();
virtual LLUIImagePtr getIcon() const;
virtual const std::string& getDisplayName() const;
@@ -274,7 +276,6 @@ public:
virtual void selectItem();
virtual void restoreItem();
-
virtual LLUIImagePtr getIcon() const;
virtual BOOL renameItem(const std::string& new_name);
virtual BOOL removeItem();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 21af491408..ca310cf8e4 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -478,6 +478,14 @@ bool idle_startup()
}
LLHTTPSender::setDefaultSender(new LLNullHTTPSender());
+
+ // TODO parameterize
+ const F32 circuit_heartbeat_interval = 5;
+ const F32 circuit_timeout = 100;
+
+ const LLUseCircuitCodeResponder* responder = NULL;
+ bool failure_is_fatal = true;
+
if(!start_messaging_system(
message_template_path,
port,
@@ -485,7 +493,11 @@ bool idle_startup()
LL_VERSION_MINOR,
LL_VERSION_PATCH,
FALSE,
- std::string()))
+ std::string(),
+ responder,
+ failure_is_fatal,
+ circuit_heartbeat_interval,
+ circuit_timeout))
{
std::string msg = LLTrans::getString("LoginFailedNoNetwork");
msg.append(llformat(" Error: %d", gMessageSystem->getErrorCode()));
diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp
index 52d1436761..c71d63a2d7 100644
--- a/indra/test/lltemplatemessagebuilder_tut.cpp
+++ b/indra/test/lltemplatemessagebuilder_tut.cpp
@@ -59,6 +59,9 @@ namespace tut
if(! init)
{
ll_init_apr();
+ const F32 circuit_heartbeat_interval=5;
+ const F32 circuit_timeout=100;
+
start_messaging_system("notafile", 13035,
LL_VERSION_MAJOR,
LL_VERSION_MINOR,
@@ -66,7 +69,9 @@ namespace tut
FALSE,
"notasharedsecret",
NULL,
- false);
+ false,
+ circuit_heartbeat_interval,
+ circuit_timeout);
//init_prehash_data();
init = true;
}
diff --git a/indra/test/message_tut.cpp b/indra/test/message_tut.cpp
index d426511d24..0cafdcd679 100644
--- a/indra/test/message_tut.cpp
+++ b/indra/test/message_tut.cpp
@@ -70,6 +70,9 @@ namespace tut
//init_prehash_data();
init = true;
}
+ const F32 circuit_heartbeat_interval=5;
+ const F32 circuit_timeout=100;
+
// currently test disconnected message system
start_messaging_system("notafile", 13035,
@@ -79,7 +82,10 @@ namespace tut
FALSE,
"notasharedsecret",
NULL,
- false);
+ false,
+ circuit_heartbeat_interval,
+ circuit_timeout
+ );
// generate temp dir
std::ostringstream ostr;
#if LL_WINDOWS